트랜잭션 처리의 순차성을 보장하기 위한 방법
http://wiki.gurubee.net/pages/viewpage.action?pageId=26745044
공유 잠금
- 베타 잠금
, 베타 잠금
- 베타 잠금
lock_timeout
을 설정하여 해당 잠금의 최대 시간을 설정한다.
lock_timeout
동시 접근을 막기위해 고의적으로 테이블에 잠금을 걸었을 때,
뒤이어 해당테이블에 접근하는 세션이 좀 더 대기해주길 원할때 사용
🔍 잠금 제한 시간 설정은 세션별로 적용되기 때문에, 새로운 세션으로 접속 시에는 다시 설정을 해야 한다.
블로킹과 교착상태의 차이
일반적인 블로킹은 언젠가는(블로킹한 트랜잭션이 끝나면)사라지게 된다.
하지만 교착상태는 서로가 서로에게 블로킹을 걸었기 때문에 상대 트랜잭션이 끝나기만을 서로 기다리며 블로킹이 계속되기 때문에 끝나지 않는다.
Transaction 1> start transaction; insert into B values(1); # lock (B)
Transaction 2> start transaction; insert into A values(1); # lock (A)
Transaction 1> insert into A values(1); # lock(A)에 접근
Transaction 2> insert into B values(1); # lock(B)에 접근
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
SET LOCK_TIMEOUT
문을 통해 일정 시간이 지나면 쿼리를 취소한다(+) 비관적 락과 낙관적 락
비관적 락
(pessimistic lock)
- 충돌이 일어날 것이라고 가정하고 시작
- 트랜잭션에서 변경하려는 레코드에 대해 락(Shared Lock 또는 Exclusive Lock)을 획득하고 쿼리를 수행하는 방식
- Reeatable Read 또는 Serializable 정도의 격리성 수준에서 가능 격리성 알아보기
- 충돌이 많이 발생하는 경우에 사용
- 공유잠금(Shared lock), 베타잠금(Exclusive lock) 전부 일어날 수 있음
낙관적 락
(optimistic lock)
- 충돌이 일어나지 않을 것이라고 가정하고 시작
- 트랜잭션에서 락 없이 일단 쿼리 수행을 하고 마칠 때 서로 다른 트랜잭션에서 충돌이 있었는지 확인하고 문제가 있으면 충돌이 난 트랜잭션을 롤백하는 방식
- DB에서 제공해주는 특징을 이용하는 것이 아닌 Application Level에서 잡아주는 Lock
- 충돌이 적게 발생하는 경우에 사용
- 공유잠금(Shared lock), 베타잠금(Exclusive lock) 전부 일어날 수 있음