https://dev.mysql.com/doc/refman/8.4/en/innodb-transaction-isolation-levels.html
SET TRANSACTION
을 통해서, Statement의 격리 수준을 설정할 수 있다.SELECT WITH FOR UPDATE OR FOR SHARE
)는 인덱스의 종류에 따라서 동작이 달라질 수 있다.Range, Next-Key 잠금 읽기를 통해서, Phantom Read가 발생하지 않는 것처럼 느껴질 수도 있어보인다.
locking reads
, SELECT with FOR UPDATE or FOR SHARE
)와 비잠금 읽기를 사용하는 것은 권장되지 않는다, 비잠금 읽기는 스냅샷이지만, 잠금 읽기는 최신의 스냅샷을 사용하므로 두 개의 다른 테이블을 바라보고 있다. 또한 잠금 읽기를 사용하는 것은 대부분 SERIALIZABLE
인 격리성을 고려해야 한다.// Session A
x-lock(1,2); retain x-lock
x-lock(2,3); update(2,3) to (2,5); retain x-lock
x-lock(3,2); retain x-lock
x-lock(4,3); update(4,3) to (4,5); retain x-lock
x-lock(5,2); retain x-lock
// Session B
x-lock(1,2); block and wait for first UPDATE to commit or roll back
Phantom Rows
)가 발생할 수 있다.Phantom Rows
: 트랜잭션 내에서 특정 쿼리를 여러번 했을 때, 시점에 따라 다른 결과가 나타나는 현상SELECT * FROM child WHERE id > 100 FOR UPDATE;
x-lock(1,2); unlock(1,2)
x-lock(2,3); update(2,3) to (2,5); retain x-lock
x-lock(3,2); unlock(3,2)
x-lock(4,3); update(4,3) to (4,5); retain x-lock
x-lock(5,2); unlock(5,2)
x-lock(1,2); update(1,2) to (1,4); retain x-lock
x-lock(2,3); unlock(2,3)
x-lock(3,2); update(3,2) to (3,4); retain x-lock
x-lock(4,3); unlock(4,3)
x-lock(5,2); update(5,2) to (5,4); retain x-lock
커밋까지 시간이 오래 걸리는 경우, 데이터들을 추적하는 용도로 사용할 수 있어보인다.
SELECT ... FOR SHARE
가 적용된다.