컴퓨터

트랜잭션 격리 수준이란? (transaction isolation level)

곤정이 2023. 12. 30. 20:47
반응형

트랜잭션 격리 수준이란 무엇일까?

각각의 트랜잭션이 동시에 작업을 처리할 때 어느정도 범위로 격리를 허용할 것 인지 결정하는 것.

 

격리수준 종류

Read uncommitted (level 0)

Read committed  (level 1)

Repeatable read  (level 2)

Serializable  (level 3)

 

트랜잭션 격리수준에 따른 발생하는 이상현상

Dirty read : 트랜잭션이 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상

Non-repeatable read : 하나의 트랜잭션 내에서 데이터를 조회 시 서로 다른 데이터를 가져오는 현상Phantom read : 하나의 트랜잭션 내에서 없던 레코드가 생기거나 제거되는 현상

  Dirty read Non-repeatable read Phantom read
Read uncommitted  O O O
Read committed X O O
Repeatable read X X O
Serializable   X X X

 

 

Read uncommitted (level 0)

  • 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다. (emp_no 50000 을 커밋 전에 읽는 현상)
  • 정합성에 문제가 많은 격리 수준이기 때문에 사용하지 않는 것을 권장한다.

 

Read committed  (level 1)

  • RDB에서 대부분 기본적으로 사용되고 있는 격리 수준이다.
  • 실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드에서 값을 가져온다. (Lara를 읽어가는 부분)

 

Repeatable read  (level 2)

  • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
  • Undo 공간에 백업해두고 실제 레코드 값을 변경한다.
    • 백업된 데이터는 불필요하다고 판단하는 시점에 주기적으로 삭제한다.
    • Undo에 백업된 레코드가 많아지면 MySQL 서버의 처리 성능이 떨어질 수 있다.
  • Mysql의 기본값

 

Serializable  (level 3)

  • 가장 단순한 격리 수준이지만 가장 엄격한 격리 수준
  • 성능 측면에서는 동시 처리성능이 가장 낮다.
  • SERIALIZABLE에서는 이상현상이 모두 발생하지 않는다.
  • 엄격하지만 많은 트랜잭션을 처리하기에는 무거운 점이 있다.

 

참고 서적

Real MySQL 8.0 1, 위키북스

반응형