-
2024.07.21 select for updateTIL 2024. 7. 21. 21:48
select for update 시 행이 없다면?
select for update 시 잠금에 대한 내용이다.
요약하자면 repeatable read 격리 수준에서 phantom read를 막기 위해 gap lock을 잡는다
아래와 같이 처음 발견된 레코드(12)와 쿼리가 정의한 범위 내의 빈 공간의 수정을 방지하는 것이다.
SELECT * FROM t_user WHERE id > 10 FOR UPDATE;
존재하지 않는 값(11)과 범위 밖에 있는 값에 대해서도 gap lock을 건다
- 빈 테이블에 전체 잠금 시
- select * from sample for update;
- Tx1의 select for update와 Tx2의 select for update는 동시에 이뤄진다.
- insert 시 잠금이 걸린다.
- 빈 테이블에 서로 다른 범위에 잠금 시
- (Tx1)select * from sample where id > 10 and id < 20 for update; , (Tx2) select * from sample where id > 50 and id < 70 for update;
- Tx1의 select for update와 Tx2의 select for update는 동시에 이뤄진다
- insert가 각각 가능
- 독립된 구역에 gap lock을 잡는다.
- 빈 테이블에 서로 겹치는 범위에 잠금 시
-
- (Tx1) select * from sample where id > 10 and id < 20 for update; , (Tx2)select * from sample where id > 15 and id < 70 for update;
- Tx1의 select for update와 Tx2의 select for update는 동시에 이뤄진다
- insert 시 잠금이 걸린다.
-
데이터가 없는 부분에서 범위가 겹쳐도 조회가 이뤄지는 이유는 gap lock은 S lock형태로만 존재하기 때문이라고 한다.
데이터가 있다면 X lock 때문에 select 조차 불가능해지고.
gap lock의 예제를 보다 시피 select for update의 lock은 데이터 유무에 따라 select 시 또는 insert 시에 발생할 수 있다.
- https://miintto.github.io/docs/mysql-select-for-update
- https://medium.com/daangn/mysql-gap-lock-%EB%8B%A4%EC%8B%9C%EB%B3%B4%EA%B8%B0-7f47ea3f68bc
- https://medium.com/daangn/mysql-gap-lock-%EB%91%90%EB%B2%88%EC%A7%B8-%EC%9D%B4%EC%95%BC%EA%B8%B0-49727c005084
- https://dev.mysql.com/doc/refman/8.4/en/innodb-locking.html
'TIL' 카테고리의 다른 글
2024.07.23 gap lock (0) 2024.07.23 2024.07.22 gap lock (0) 2024.07.22 2024.07.19 분산 트랜잭션, TCC (0) 2024.07.20 2024.07.12 포프 (0) 2024.07.12 2024.07.10~11 Query Tuning (0) 2024.07.11 - 빈 테이블에 전체 잠금 시