-
2024.08.01 Locks Set by SQLTIL 2024. 8. 1. 23:59
MySQL :: MySQL 8.0 Reference Manual :: 17.7.3 Locks Set by Different SQL Statements in InnoDB
17.7.3 Locks Set by Different SQL Statements in InnoDB A locking read, an UPDATE, or a DELETE generally set record locks on every index record that is scanned in the processing of an SQL statement. It does not matter whether there are WHERE conditions in
dev.mysql.com
gap lock을 공부하려 이거 저거 읽어보는 중..
sql에 따라 lock을 잡는 게 다르다.
locking read나 update, delete문은 인덱스 스캔한 것들을 모두 잠근다.
where절에 만족하지 않아도 스캔 중에 만난 인덱스 record는 lock이 걸린다.
만족하는 인덱스가 없으면 풀 테이블 스캔을 하고 다 잠글 것이다.
locking read인 select for update, select for share unique 한 index를 통해 스캔하면 where절에 포함되지 않는 절은 lock을 해제한다.
위에 설명한 것과는 상반되는 기능이다.
locking read나 update, delete문은 유니크 인덱스를 쓰냐 안 쓰냐에 따라 lcok 범위가 다르다.
uk는 record lcok만 걸고 gap lock은 안건다. 다만 값이 없으면 검색된 모든 레코드에 next key lock을 건다.
나머지 secondary index는 next key lock (gap lock + record lock)을 건다.
MVCC에서는 select for update가 잠금을 잡아도 read view (shap shot)을 통해서 읽기 때문에 잠금과 무관하다.
다만 locking read를 동시에 하면 lock이 걸리고..
pk를 수정한다면 secondary index에 뭔가 shared lock을 거는 거 같은데..
insert는 record lock을 잡고 gap lock은 잡지 않는다.
insert 전에 insert intention lock이 잡힌다. locking read, update, delete에 사용되는 IX와는 다른 lock인가? 기능적으로는 다른 거 같은데 이름이 비슷하다.
다음부터 읽기
'TIL' 카테고리의 다른 글
2024.08.05 Locks Set by SQL 3, INSERT INTO T SELECT ... FROM S WHERE.. (0) 2024.08.05 2024.08.02~04 Locks Set by SQL 2 (0) 2024.08.04 2024.07.27~28 gap lock (0) 2024.08.01 2024.07.23 gap lock (0) 2024.07.23 2024.07.22 gap lock (0) 2024.07.22