Transaction Isolation Level

hjkim·2023년 6월 17일
1

https://velog.io/@guswlsapdlf/Transaction-Model

이전에도 transaction isolation level에 관한 글을 쓴 적이 있지만, 내용을 더 추가하고자 글을 작성하게 되었다.

Transaction Isolation Level

여러 트랜잭션이 발생했을 때, 각 트랜잭션이 다른 트랜잭션에 어느 정도까지 영향을 받게 설정할지 그 수준을 정의한 것이 바로 transaction isolation level이다.

REPEATABLE READ

Inno DB의 기본 값으로 트랜잭션이 시작할 때 snapshot을 뜨고 해당 snapshot에서 계속 데이터를 읽는다. 이를 통해 동일 트랜잭션 내에서 동일한 값을 읽기가 가능하다. 하지만 다른 트랜잭션에서 snapshot에 포함된 데이터를 수정했을 때 그 데이터를 다시 읽으면 이전과는 전혀 다른 값을 읽게 되는데 이와 같은 현상을 PHANTOM READ라고 한다.

MySQL DB의 경우 이를 방지하기 위해 SELECT FOR UPDATE, SELECT FOR SHARE, UPDATE, DELETE와 읽기가 아닌 쓰기작업이 포함된 경우에는 lock을 걸어준다. where 조건절에 따라 unique index로 읽기 작업을 할 때에는 해당 record에만 lock이 걸리고 그 외의 조건절에는 gap lock이 걸린다.

READ COMMITTED

commit이 일어난 트랜잭션에 한하여 읽는다. 매번 새로운 snapshot을 떠서 읽는다. 따라서 동일 트랜잭션 내에서 읽어오는 값임에도 불구하고 값이 불일치할 수 있다. 이러한 현상을 NON-REPEATABLE READ라고 한다.

MySQL에서는 READ COMMITTED 격리 수준에서 SELECT FOR UPDATE, SELECT FOR SHARE, UPDATE, DELETE와 같은 쓰기작업이 포함된 연산에 대해 row 기반으로 lock을 걸어준다.

READ UNCOMMITTED

커밋 전 내용도 반영하여 읽는다. 다른 트랜잭션에서 변경된 값을 그대로 반영하여 읽었는데, 그 값이 rollback되면 다시 원래의 값을 읽으므로 값이 서로 불일치할 수 있다. 이러한 현상을 DIRTY READ라고 한다.

SERIALIZABLE

가장 엄격한 수준의 격리 레벨로, 트랜잭션 각각이 서로에게 전혀 영향을 주지 않는다.


[참조] https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
[참조] https://namuhuchutong.tistory.com/3

profile
피드백은 언제나 환영입니다! :)

0개의 댓글