본문 바로가기
IT/Database

트랜잭션 격리 수준(isolation level)

by 성준하이 2022. 12. 31.
반응형

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

동시에 여러 트랜잭션이 처리될 때, 트랜잭션 간 얼마나 서로 고립되어 있는지
즉, 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것

격리수준은 아래의 4개로 나뉜다.

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

아래로 내려갈수록 트랜잭션간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적이다.
일반적인 온라인 서비스에서는 READ COMMITTED나 REPEATABLE READ 중 하나를 사용한다.
(oracle = READ COMMITTED, mysql = REPEATABLE READ)

 

READ UNCOMMITTED

READ UNCOMMITTED 격리 수준에서는 각 트랜잭션의 변경 내용이 COMMIT이나 ROLLBACK 여부와 상관 없이 다른 트랜잭션에서 보여지게 된다.

더티 리드(Dirty Read) 발생

더티 리드란 다른 트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있게 되는 현상을 말한다.

아래 그림은 다른 트랜잭션에서 사용자 B가 실행하는 SELECT 쿼리의 결과에 사용자 A의 INSERT 쿼리가 COMMIT되기 전에 어떤 영향을 미치는지 보여주는 예시이다.

NON-REPEATABLE READ 발생

NON-REPEATABLE READ란, 하나의 트랜잭션 내에서 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 REPEATABLE READ 정합성에 어긋나는 것을 말한다.

 

REPEATABLE READ

REPEATABLE READ는 MySQL의 InnoDB 스토리지 엔진에서 기본적으로 사용되는 격리 수준이다. 이 격리 수준에서는 READ COMMITTED 격리 수준에서 발생하는 NON-REPEATABLE READ 부정합이 발생하지 않지만, PHANTOM READ 부정합이 발생한다. (아래에서 이야기하지만, InnoDB 스토리지 엔진을 사용할 경우 PHANTOM READ 부정합이 발생하지 않음.)

 

NON-REPEATABLE READ 해결

REPEATABLE READ는 언두(Undo) 영역에 백업된 이전 데이터를 통해 트랜잭션 내에서는 동일한 결과를 보여 주도록 보장하여 NON-REPEATABLE READ 문제를 해결한다. 사실 READ COMMITTED 격리 수준 또한 언두 영역에 백업된 이전 데이터를 보여 주지만, 두 격리 수준에는 언두 영역을 활용하는 방식이 다르다. REPEATABLE READ 격리 수준은 ‘언두 영역에 백업된 레코드의 여러 버전 가운데 몇 번째 버전을 보여 주냐’에 차이가 있어 NON-REPEATABLE READ 문제를 해결할 수 있다.

쉽게 말하자면, 언두 영역에 백업된 모든 데이터에는 변경을 발생한 트랜잭션의 번호가 포함되어 있는데, REPEATABLE READ 격리 수준에서는 실행 중인 트랜잭션보다 작은 트랜잭션에서 변경한 데이터만 보게 하여 NON-REPEATABLE READ 문제를 해결한다.

 

PHANTOM READ 발생

PHANTOM READ란, SELECT ... FOR UPDATE 쿼리와 같은 쓰기 잠금을 거는 경우 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상을 말한다.

 

ISOLATION LEVEL 조회, 변경, 테스트 방법
SHOW VARIABLES like 'tx_isolation';
SELECT @@tx_isolation;
반응형

'IT > Database' 카테고리의 다른 글

[Oracle] case 문  (10) 2023.01.12
프로시져와 함수의 차이  (13) 2023.01.06
[Oracle] Decode 함수  (42) 2022.11.18
[Mysql] 스토리지 엔진 MYISAM / INNODB  (26) 2022.11.05
[Mysql] select 랜덤값 출력  (8) 2022.10.17

댓글