[DB] 트랜잭션과 락 - 2. 공유락(Shared Lock) & 배타락(Exclusive Lock)

유알·2023년 3월 3일
0

[DB/JPA]

목록 보기
3/7

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 하기 전까지 대기함

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글