복수 개의 트랜잭션이 한 번에 처리될 때, 특정 트랜잭션이 변경하거나 조회하고 있는 데이터에 대해서 다른 트랜잭션에 대해 조회 허용 여부를 결정
격리 수준에 따라 발생할 수 있는 문제점
더티리드(Dirty Read)
- 특정 트랜잭션에 이해 데이터가 변경되었지만, 아직 커밋되지 않은 상황에서 다른 트랜잭션이 해당 변경사항을 조회할 수 있는 문제
- 예시) 트랜잭션 A가 데이터를 변경하고 커밋하지 않은 시점에 트랜잭션B가 변경된 데이터를 읽어온 상황에서 트랜잭션A가 변경된 사항을 롤백하면 치명적이다. 트랜잭션B는 변경되지 않은 데이터를 처리하므로 문제가 발생한다.
반복 불가능한 조회(Non-Repeatable Read)
- 같은 트랜잭션 내에서 같은 데이터를 여러 번 조회해서 읽어 온 데이터가 다를 경우를 나타냄
팬텀 리드(Phantom Read)
- 조회해온 결과의 행이 새로 생기거나 없어지는 현상이다.
SERIALIZABLE(직렬화 가능) - 레벨3
- 특정 트랜잭션이 사용중인 테이블의 모든 행을 다른 트랜잭션이 접근할 수 없도록 잠근다.
- 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 SharedLock이 걸린다.
- 완벽한 읽기 일관성 모드가 제공된다.
- 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.
REPEATABLE READ(반복 가능한 읽기) - 레벨2
- 특정 행을 조회 시 항상 같은 데이터를 응답하는 것을 보장하는 격리수준
- 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다.
- 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정이 불가능하다.
- MySQL에서 Default로 사용하는 격리수준
- 발생할 수 있는 문제 : Phantom Read
READ COMMITED(커밋된 읽기) - 레벨1
- 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회할 수 있도록 허용
- 특정 트랜잭션에서 데이터가 변경되었으나, 아직 커밋되지 않은 상태라면 다른 트랜잭션에서는 해당 데이터에 접근했을 때 트랜잭션 시작 전 데이터를 읽어온다. 커밋이 된 이후에서야 변경된 데이터 값을 읽어올 수 있다.
- 특정 트랜잭션이 이루어지는 동안 다른 트랜잭션은 해당 데이터에 접근이 불가능하다.
- SELECT 문장이 수행되는 동안 해당 데이터에 SharedLock이 걸리는 계층이다.
- SQL 서버가 Default로 사용하는 격리수준
- 발생할 수 있는 문제 : Phantom Read, Non-Repeatable Read
READ UNCOMMITED(커밋되지 않은 읽기)
- 커밋이 되지 않은 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 조회하는 것을 허용하는 격리 수준이다.
- SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
- 데이터베이스의 일관성을 유지하는 것이 불가능하다
- 트랜잭션에 처리중이거나, 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함
- 발생할 수 있는 문제 : DirtyRead, Phantom Read, Non-Repeatable Read
출처
https://gyoogle.dev/blog/computer-science/data-base/Transaction%20Isolation%20Level.html
https://hudi.blog/transaction-isolation-level/