데이터베이스

트랜잭션 격리 수준에 따른 문제점

realtrynna 2022. 11. 14. 23:26

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

 

 

트랜잭션 격리 수준은 트랜잭션 격리가 성공하는 정도의 측정값을 의미한다. 다른 말로  트랜잭션들의 고립의 정도를 나타내며 서로 다른 트랜잭션끼리 변경된 데이터를 볼 수 있도록 허용 여부를 결정해야 한다. ACID 특성 중 격리성(Isolation)이 완벽히 보장되려면 거의 순차적으로 실행되어야 하는데 이렇게 되면 성능이 매우 저하된다. 격리성은 격리 수준을 4단계로 나누어 격리성을 보장한다.

 

격리 수준

  1. 커밋 되지 않은 읽기(READ_UNCOMMITTED)
    가장 낮은 격리 수준으로 하나의 트랜잭션이 커밋 되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 성능은 가장 빠르다. 데이터의 정합성에 문제가 있어 대부분의 RDBMS에서는 격리 수준으로 인정하지 않는다.
    Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생

  2. 커밋 된 읽기(READ_COMMITED)
    트랜잭션이 커밋 하지 않은 정보는 읽을 수 없다. 즉 커밋이 완료된 데이터에 대해서만 조회를 허용한다.
    대부분의 RDB에서 사용되는 격리 수준으로 MySQL, PostgreSQL, SQL Server, Oracle에서 기본값으로 설정되어 있다.
    Non-Repeatable Read, Phantom Read 현상 발생

  3. 반복 가능한 읽기(REPEATABLE READ)
    트랜잭션이 시작되기 전에 커밋 된 내용에 대해서만 조회할 수 있다.
    Phantom Read 현상 발생

  4. 직렬화(SERIALIZABLE)
    트랜잭션이 순차적으로 실행된다. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없으며 교착 상태가 일어날 확률이 많고 가장 성능이 떨어지는 격리 수준이다. 

 

 

격리 수준에 따른 문제점

  1. 더티 리드(Dirty Read)
    트랜잭션이 아직 커밋 되지 않은 데이터를 읽을 경우 발생하는 현상이다. 예를 들어 트랜잭션 1이 행을 업데이트한다고 가정하면 트랜잭션 2는 트랜잭션 1이 업데이트를 커밋 하기 전에 업데이트된 행을 읽는다.

  2. 반복 가능하지 않은 조회(Non Repeatable Read)
    한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데 그 값이 다른 현상을 의미한다. 한 트랜잭션 내에서 같은 쿼리가 2번 실행될 경우 그 사이에 트랜잭션이 값을 수정하거나 삭제함으로써 두 쿼리의 결과가 서로 달라질 수 있다.

  3. 팬텀 리드(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://learn.microsoft.com/ko-kr/sql/odbc/reference/develop-app/transaction-isolation-levels?view=sql-server-ver16

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