database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 27812 게시물 읽기
No. 27812
다시 질문드립니다. 트랜잭션과 락킹
작성자
작성일
2008-09-26 14:33
조회수
4,016


수강신청을 구현하고 있습니다


수강정보테이블에는 여러학생들이 수강신청을 할때마다 하나의 레코드가 들어가게

됩니다. 정원을 초과하였나 검사할때는

해당 테이블에서 레코드갯수를 세 검사합니다.


여기서 문제가 있습니다.


정원이 1자리가 남아있습니다. 그리고 a,b,c,d,e 5명이 수강신청을 합니다.


트랜잭션을 걸었습니다.


----------------

1.

select * from 수강정보... (쿼리는 대충 생략합니다)

해서 레코드갯수가 정원을 초과하지 않았나 검사합니다. 현재

2자리가 남았다고 가정합니다.

이때 5명이 동시에 트랜잭션을 시작해서 5명 모두 조건을 통과

했습니다.


2.

해당 조건을 통과하였음으로 5명 모두 인서트를 할수 잇습니다.

a가 젤 먼저 인서트를 수행합니다. 그리고 나머지 4명도

인스터를 시도합니다. 그러나 a가 젤 먼저 수행해서

테이블에는 쓰기락이 걸립니다. 그리고 나머지 4명은 인서트에

서 대기하게 됩니다.


3.

a는 인서트를 완료하고 트랜잭션을 종료합니다. 동시에 쓰기락은

해제됩니다. 그래서 나머지 4명중 한명이 인서트를 시도하게되고

쓰기락을 걸게됩니다.



여기서 문제입니다.

이미 a가 인서트를 하게되서 정원이 가득차게 됩니다.

나머지 4명은 인서트를 하게 되면 안되는 겁니다.


그래서 제가 내린 결론은

a가 인서트를 수행할때 나머지유저들은 수강자리가 남았나

select 하는 시점도 락이 되야 한다고 생각합니다.

즉 4명중 한사람씩 번갈아 락걸리면서 select...

어떻게 하면 이렇게 할수 있을까요?


아니면 더 좋은 방법, 일반적인 방법 아시는분??


이 글에 대한 댓글이 총 2건 있습니다.
Declare @seat int
Select @seat=count(*) From 수강
If seat<정원
 begin
  Insert---------------
 end

이런식으로 프로시져 만들어서 하면 안될까요?
내가 너무 쉽게 생각하나?
제로당님이 2008-09-26 16:06에 작성한 댓글입니다. Edit

트랜잭션을 이야기할때 많이 등장하는 것이 은행의 계좌 이야기를 많이 합니다.

 

계좌이체를 하는 경우

 

예금이 5만원 밖에 없다면 5만원을 초과하는 이체요청에 대해서는 거부를 해야되기 때문에

 

A통장에서 B통장으로 이체를 요청받는 경우

 

1. 인출 요청을 받은 금액이 인출이 가능한가?

2. A통장에서 출금한다.

3. B통장에 입금한다.

 

정도로 간단히 말해볼 수 있습니다.

 

5만원 밖에 없는 A통장에서 B통장으로 서로 다른 여러 동네의 지점에서 동시에 5명이 이체를 요구하면 어떻게 될까요?

 

위의 경우 2, 3번 프로세스만 트랜잭션으로 묶는다면

 

5개 지점에서 각각 인출이 가능함을 확인했으므로, 5번의 이체가 발생할 수 있습니다.

 

따라서 2와 3만을 트랜잭션으로 묶으면 당연히 안되겠죠.

 

그래서 1, 2, 3을 모두 묶어서 트랜잭션으로 수행해야 합니다.

 

 

질문을 하신 수강신청의 경우에도 마찬가지로 입력을 하는 트랜잭션 안에

 

수강이 가능한지를 확인하는 프로세스가 들어가 있어야만 합니다.

 

 

 

 

우욱님이 2008-09-29 14:23에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
27815긴 String 값을 일정한 단위로 쪼게서 저장하는 방법 있나요? [2]
초보
2008-10-01
3948
27814동적쿼리시 성능 및 질문 입니다.
정혁채
2008-09-30
3848
27813판매일 별 제품 판매 개수 및 제품별 거래 현황 구하기...인데 [1]
Psycho
2008-09-30
3850
27812다시 질문드립니다. 트랜잭션과 락킹 [2]
2008-09-26
4016
27811mysql limit 관련 질문입니다.
바다소년
2008-09-26
4664
278105.1에서 한글깨짐현상 [2]
초선
2008-09-25
4897
27809트랜잭션과 락킹 [1]
박종태
2008-09-25
3848
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다