Lock?
1. 필요한 이유
- 이전에 보았던 Isolation Level은 connection 단위로만 적용이 가능하다.
- 한 트랜잭션에서 select한 row에 대해 다른 트랜잭션을 동시성 제어하고 싶은 경우 Lock을 사용해야 한다.
2. Lock의 종류
1. Shared Lock (공유락)
- 다른 트랜잭션의 읽기 허용 / 쓰기 방지
- Exclusive Lock 이 없는 경우 사용 가능
2. Exclusive Lock (베타락)
- 다른 트랜잭션의 읽기 방지 / 쓰기 방지
- 다른 모든 Lock 이 없는 경우 사용 가능
3. Lock 만들기
Shared Lock 만들기
Shared Lock은 select
절 뒤에 for share
을 붙여서 만들 수 있다.
- ex) select * from table where id=1 for share
- 다른 커넥션에서 읽기 가능
- 다른 커넥션에서 쓰기 불가
- 다른 커넥션에서 Shared Lock 지정 가능
Exclusive Lock 만들기
Exclusive Lock은 select
절 뒤에 for update
를 붙여서 만들 수 있다.
- ex) select * from table where id=1 for update
- 다른 connection 에서 읽기, 쓰기도 불가능하고 아무런 lock 도 걸 수 없다.
- 다른 connection 에서 읽기를 시도하면 대기한다.
4.상황별 동작 정리 (MySql 기준)
shared lock 이 걸린 row update 시도
Lock을 건 트랜잭션이 커밋을 할 때까지
다른 트랜잭션은 일단 대기하고, 설정한 time out 보다 오래걸릴 경우 timeout ERROR가 발생한다.
서로 다른 row에 shared lock을 걸고 서로의 locked row를 수정하려고 시도
한쪽이 DEADLOCK 을 감지하여 롤백
서로 같은 row에 shared lock을 걸고 update 시도
한쪽이 commit 하기 전까지 대기함