수강신청을 구현하고 있습니다
수강정보테이블에는 여러학생들이 수강신청을 할때마다 하나의 레코드가 들어가게
됩니다. 정원을 초과하였나 검사할때는
해당 테이블에서 레코드갯수를 세 검사합니다.
여기서 문제가 있습니다.
정원이 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...
어떻게 하면 이렇게 할수 있을까요?
아니면 더 좋은 방법, 일반적인 방법 아시는분??
|