본문 바로가기

진리는어디에

MySQL transaction isolation level

 

MySQL의 innoDB에서 제공하는 transaction isolation level. 한글로 하면 '트랜잭션 격리 수준'이라고 한다.

트랜잭션이란?

트랜잭션 격리 수준에 대해 알아보기 앞서, 트랜잭션이 무엇인지 먼저 알아보자.
트랜잭션이란, 데이터베이스의 상태를 변경하기 위해 수행하는 '작업의 단위'라고 정의 할수 있다. 예를 들어 데이터베이스로 부터 select하고 그 결과에 따라 update를 통해 해당 값을 변경하기까지의 모든 과정을 하나의 트랜잭션이라고 할수 있다.

트랜잭션이 하나의 작업 단위로서 올바르게 동작하기 위해서는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation, 독립성이라고 표현하기도 한다), 지속성(Durability). 이 4가지 조건이 만족 되어야 한다.

  • 원자성 : 트랜잭션의 작업은 데이터베이스에 모두 반영 되거나, 모두 반영 되지 않아야 한다. 일부는 반영 되고 일부는 반영되지 않는다면 원자성이 지켜지지 않은 것이다.
  • 일관성 : 동일한 조건엔 항상 같은 결과여야 한다. 트랜잭션이 진행 되는 동안엔 데이터베이스가 변경 되더라도 처음 시작한 데이터베이스로 진행 된다.
  • 격리성 : 하나의 트랜잭션이 다른 트랜잭션들로 부터 연산의 결과에 대한 간섭을 받지 않는다.
  • 지속성 : 트래잭션이 완료 되고 나면 결과는 영구적으로 반영 되어야 한다.

트랜잭션 격리 수준은 위의 네가지 조건중 '격리성'에 관련된 것으로써 데이터베이스의 성능과 격리성 중 어느것에 비중을 두느냐에 따라 네가지 종류의 격리 수준을 지원한다.

READ UNCOMMIT

  • 가장 격리성이 낮은 레벨.
  • 다른 트랜잭션에서 아직 커밋 되지 않은 데이터를 읽어 올수 있는 레벨. 동시 처리 성능은 좋지만 Dirty Read, Non-Repeatable Read, Phantom Read 문제가 발생 할 수 있다(격리성 관련 문제점).
  • 커밋 되지 않아도 읽어 올 수 있기에, 트랜잭션 1에서 변경한 값을 트랜잭션 2에서 읽어 왔는데, 읽어 오고 난 뒤에 트랜잭션 1이 원래의 값으로 롤백하면 데이터가 꼬이게 된다(Dirty Read)
  • 한 트랜잭션 내에서 동일한 select 쿼리의 결과가 다를 수 있다. select 하는 중에 다른 트랜잭션에 의해 해당 데이터가 변경 될수도 있다(Non-Repeatable Read).
  • 이전에 없던 row가 생겼거나 없어 졌을 수도 있다(Phantom Read).
  • 전체적으로 읽어온 데이터의 신뢰성이 낮다. 낮다라는 의미는 신뢰 할수 없음이고 신뢰 할수 없다면 신뢰도가 0과 마찬가지다.

READ COMMITED

  • 다른 트랜잭션에서 커밋된 데이터만 읽어 올수 있다.
  • 같은 트랜잭션에서 동일한 select 쿼리를 실행 한다고 하더라도 그 사이 다른 트랜잭션에서 커밋이 발생 할 수 있으므로 동일 트랜잭션 같은 select 쿼리라도 결과가 다를 수 있다(Non-Repeatable Read).
  • 이전에 없던 row가 생겼거나 없어 졌을 수도 있다(Phantom Read).
  • select 쿼리 시 테이블 lock을 잡지 않고 매 select query 마다 snapshot을 구축하여 데이터를 읽어 온다
  • Dirty Read가 발생 하지 않는다. Non-Repeatable Read, Phantom Read는 여전히 발생 할 수 있다.

REPEATABLE READ

  • 한 트랜잭션 내에서 동일한  select 쿼리의 결과가 같음
  • select 쿼리 시에 테이블 lock을 잡지 않고 트랜잭션 시작시 구축한 snapshot에서 데이터를 읽어 온다
  • 테이블 lock을 잡지 않았기에 select 결과는 같더라도 다른 트랜잭션에서 update, insert 한 것에 대해서는 영향을 받는다(Phantom Read).

SERIALIZABLE

  • 데이터 consistancy 100%
  • 매 쿼리 마다 table, row lock 다 잡음
  • 동시 처리 성능은 가장 낮다.

부록 1. 참고

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!