https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
InnoDB implements standard row-level locking where there are two types of locks, shared (S) locks and exclusive (X) locks.
Shared Lock은 Lock을 유지하는 트랜잭션이 행을 읽을 수 있도록 한다.
트랜잭션 T1이 행 r 에 대해 Shared Lock (S)을 보유하고 있는 경우, 일부 구별되는 트랜잭션 T2이 행 r에 대한 Lock 요청은 다음과 같이 처리된다
트랜잭션 T1이 행 r에 대한 eXclusive (X) Lock을 보유하고 있는 경우, 어느 한 유형의 r에 대한 Lock에 대한 어떤 별개의 트랜잭션 T2로부터의 요청이 즉시 허용될 수 없다. 트랜잭션 T2는 트랜잭션 T1이 행에 대한 Lock을 해제하기를 기다려야 한다.
Intention - 의도
InnoDB는 row level lock들과 table lock들의 공존을 허용하는 다중 세분화 locking(multiple granularity locking)을 지원한다.
다중 세분화 locking을 실용적으로 만들기 위해 InnoDB는 Intention Lock을 사용한다.
Intention Lock은 테이블 내의 행에 대해 트랜잭션이 나중에 어떤 유형의 Lock(S 또는 X)을 요구하는지를 나타내는 테이블 수준의 Lock이다.
Intention Lock에는 두 가지 유형이 있다:
예를 들어 SELECT ... FOR SHARE는 IS Lock을 설정하고 SELECT ... FOR UPDATE는 IX Lock을 설정한다.
The intention locking protocol은 다음과 같습니다:
테이블 수준의 Lock 호환성은 다음 표로 요약된다.
X | IX | S | IS | |
|---|---|---|---|---|
X | Conflict | Conflict | Conflict | Conflict |
IX | Conflict | Compatible | Conflict | Compatible |
S | Conflict | Conflict | Compatible | Compatible |
IS | Conflict | Compatible | Compatible | Compatible |
X lock은 어떤 lock이던 Conflict
S lock은 X, IX락만 충돌 -> S락이 설정되어있다면, 다른 t에서는 X, IX락을 설정할 수 없다.
IS lock은 X락만 충돌 -> S락을 설정하기 위해 IS락이 잡혀있다면, 다른 t에서는 X락을 설정할 수 없다.
IX lock은 S, X락만 충돌 -> X락을 설정하기 위해 IX락이 잡혀있다면, 다른 t에서는 S락, X락을 설정할 수 없다.
요청하는 트랜잭션에게 기존 Lock과 호환되는 경우 Lock이 부여되지만, 기존 Lock과 충돌하는 경우에는 부여되지 않는다. 트랜잭션은 충돌하는 기존 Lock이 해제될 때까지 대기한다.
Lock 요청이 기존 Lock과 충돌하여 교착(deadlock) 상태를 초래할 수 있어 부여할 수 없는 경우 오류가 발생한다.
Intention Lock은 전체 테이블 요청ex) LOCK TABLE ... WRITE을 제외한 어떤 것도 차단하지 않는다.
Intention Lock의 주요 목적은 누군가가 행을 잠그고 있거나 테이블의 행을 잠그고 있음을 보여주는 것이다.