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 27809 게시물 읽기
No. 27809
트랜잭션과 락킹
작성자
박종태(rasungboy)
작성일
2008-09-25 14:00
조회수
3,848

안녕하세요.


예를들어 좌석예매라던지 수강신청이라던지 정원이 정해져있을대


수백명의 요청이 정원에 맞게 처리되기 위해서는 어떤식으로


처리해야 되는지 궁금합니다.


예를들어 영화예매같은경우 3자리가 남았습니다.


그리고 10명이 동시에 예매를 신청합니다.


어느자리를 예매할지는 정하지 않는다고 칩니다.


10명은 select * from 예매정보 를 수행해서 자리가 남았는지 검사합니다.


10명이 동시에 했다고 치고 3자리가 남은걸 10명모두 확인했습니다.


조회결과 자리가 남았으므로 예매를 할수 있겠고 결과적으로 10명모두


데이타를 넣을수 있는 조건(3자리가남았으므로)을 충족해서


10개의 예매정보가 들어갑니다. 그러나 7개는 오버플로우 된것이죠.


이런경우를 위해 테이블에 락을 건다고 알고 있습니다.


근데 락을 건다고하더라도 문제가 있을것 같습니다.


아래와같은 시나리오입니다.


한명이 예매정보 테이블에 락을 겁니다. 그리고 자리가 남았는지


조회합니다. 그와 동시에 다른사람들은 자리가 남았는지 검사하는


부분에서 해당테이블을 접근하다가 락에의해 대기합니다.


그리고 락을 건 사람은 예매정보를 입력하고 락을 해제합니다.


이때 자리가 남았나 검사하는 부분에서 대기중이던 다른 사람들은


동시에 테이블에 접근할수 있겠고 결과적으로 2자리가 남은걸 확인하고 모든


사람들이 동시에 데이타를 인서트 합니다. 결국 맨처음과 같은 경우가


발생하는 것이죠.


이런경우는 트랜잭션으로도 어떻게 해볼수 없는것 같은데


보통 어떤방법을 쓰는지 궁금합니다

이 글에 대한 댓글이 총 1건 있습니다.

마지막 예를 들으신 부분에 오류가 있습니다.



동시에 테이블에 접근할 수 있겠고 결과적으로 2자리가 남은 걸 확인하고 모든

사람들이 동시에 테이블에 락을 걸기를 시도합니다.

하지만 한 사람만 락을 거는데 성공하고 락을 걸지 못한 사람들은 다시 대기합니다.

락을 거는 데 성공한 사람은 insert를 수행하고 다시 락을 풀어 놓습니다.

그러면 남아있던 모든 사람들이 락을 거는 것을 시도합니다.



와 같은 전개가 맞습니다.

우욱님이 2008-09-26 01:13에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
27812다시 질문드립니다. 트랜잭션과 락킹 [2]
2008-09-26
4015
27811mysql limit 관련 질문입니다.
바다소년
2008-09-26
4664
278105.1에서 한글깨짐현상 [2]
초선
2008-09-25
4897
27809트랜잭션과 락킹 [1]
박종태
2008-09-25
3848
27808Grant로 권한설정 문의합니다...
Grant
2008-09-25
3928
27804오라클 쿼리 my-sql로 바꾸려고 하는데요. count(*) over()
이영주
2008-09-23
4356
27803제 글만 답글이 업어용~~ 달아주세용~ [4]
김군
2008-09-23
4351
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다