평소 트랜잭션을 사용하면서 ACID 특징 정도만 알고 있었는데 격리도 수준에 따라 나누어지고 수준에 따라 발생할 수 있는 문제점들이 있다니 서버 개발자는 공부할 게 정말 많은 거 같다. 데이터베이스는 공부를 하면 할수록 매우 생소한 개념들이 나온다. 하지만 몇 번 읽어보면 이해가 가서 재밌다

트랜잭션 격리 수준은 트랜잭션 격리가 성공하는 정도의 측정값을 의미한다. 다른 말로 트랜잭션들의 고립의 정도를 나타내며 서로 다른 트랜잭션끼리 변경된 데이터를 볼 수 있도록 허용 여부를 결정해야 한다. ACID 특성 중 격리성(Isolation)이 완벽히 보장되려면 거의 순차적으로 실행되어야 하는데 이렇게 되면 성능이 매우 저하된다. 격리성은 격리 수준을 4단계로 나누어 격리성을 보장한다.
격리 수준
- 커밋 되지 않은 읽기(READ_UNCOMMITTED)
가장 낮은 격리 수준으로 하나의 트랜잭션이 커밋 되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 성능은 가장 빠르다. 데이터의 정합성에 문제가 있어 대부분의 RDBMS에서는 격리 수준으로 인정하지 않는다.
Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생 - 커밋 된 읽기(READ_COMMITED)
트랜잭션이 커밋 하지 않은 정보는 읽을 수 없다. 즉 커밋이 완료된 데이터에 대해서만 조회를 허용한다.
대부분의 RDB에서 사용되는 격리 수준으로 MySQL, PostgreSQL, SQL Server, Oracle에서 기본값으로 설정되어 있다.
Non-Repeatable Read, Phantom Read 현상 발생 - 반복 가능한 읽기(REPEATABLE READ)
트랜잭션이 시작되기 전에 커밋 된 내용에 대해서만 조회할 수 있다.
Phantom Read 현상 발생 - 직렬화(SERIALIZABLE)
트랜잭션이 순차적으로 실행된다. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없으며 교착 상태가 일어날 확률이 많고 가장 성능이 떨어지는 격리 수준이다.

격리 수준에 따른 문제점
- 더티 리드(Dirty Read)
트랜잭션이 아직 커밋 되지 않은 데이터를 읽을 경우 발생하는 현상이다. 예를 들어 트랜잭션 1이 행을 업데이트한다고 가정하면 트랜잭션 2는 트랜잭션 1이 업데이트를 커밋 하기 전에 업데이트된 행을 읽는다. - 반복 가능하지 않은 조회(Non Repeatable Read)
한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데 그 값이 다른 현상을 의미한다. 한 트랜잭션 내에서 같은 쿼리가 2번 실행될 경우 그 사이에 트랜잭션이 값을 수정하거나 삭제함으로써 두 쿼리의 결과가 서로 달라질 수 있다. - 팬텀 리드(Phantom Read)
한 트랜잭션 내에서 동일한 쿼리가 2번 실행되었을 경우 쿼리 결과가 서로 다른 현상을 의미한다. 처음 실행된 쿼리 결과에 보이지 않는 레코드(Phantom)가 두 번째 실행된 쿼리 결과 레코드에 출력될 수 있다.
Dirty Read | Non Repeatable Read | Phantom Read | |
Read Uncommitted (Level 0) |
가능 | 가능 | 가능 |
Read Committed (Level 1) |
불가능 | 가능 | 가능 |
Non Repeatable Read (Level 2) |
불가능 | 불가능 | 가능 |
Serializable (Level 3) |
불가능 | 불가능 | 불가능 |
참고 자료
https://hudi.blog/transaction-isolation-level/
http://www.yes24.com/Product/Goods/108887922
velog.io/@guswns3371/데이터베이스-트랜잭션-격리수준
'데이터베이스' 카테고리의 다른 글
MySQL 옵티마이저 (0) | 2022.11.01 |
---|---|
Prisma Relation (0) | 2022.10.17 |
Prisma (0) | 2022.10.13 |
DBMS (0) | 2022.10.03 |
MySQL 자료형 옵션 (0) | 2022.05.08 |