본문 바로가기
Tech/Database

Transaction Isolation Level 이해

by Augustine™ 2018. 11. 22.
반응형

Database의 Transaction Isolation Level(트랜잭션 고립화 수준)이란?

DBMS마다 Lock 메커니즘인 Isolation Level 을 가지고 있다. 데이터의 무결성을 보장하기 위해 존재하는 것으로, 다른 트랜잭션이 현재의 데이터에 대한 무결성을 해치지 않기 위해 잠금을 설정하는 것을 말한다.

고립화 수준은 보통 4단계로 나누어지며, 1단계인 Read Committed가 각 DBMS마다 가지고 있는 기본 Lock 레벨이다.

실습을 통해 고립화 수준을 이해해보자. 여기서는 SQL Server 2017 Expression 버전을 사용하였다.


먼저 Read Uncommitted(Level 0) 이란?

-. 트랜잭션에서 처리 중인, 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용하는 것을 말하며, Dirty Read, Non-Repeatable Read, Phantom Read 현상이 발생한다.

이 레벨을 학습하면서, 모든 트랜잭션 고립화 수준에서 발생하는 Dirty Read 현상에 대해 알아보자.


table 생성 스크립트와 기초 데이터는 아래와 같다.


CREATE TABLE LOCKTAB (
	IDX1 INTEGER PRIMARY KEY
	, STRNAME VARCHAR(100)
	, CRE_DT DATETIME DEFAULT 
);
INSERT INTO LOCKTAB VALUES(1000, '사과', 1000);


세션1에서 다음과 같은 트랜잭션을 수행한다고 가정하자.


BEGIN TRAN
	UPDATE LOCKTAB SET PRO_VAL= '2000' WHERE IDX1 = 1000

ROLLBACK;	


위 세션의 Update 쿼리문을 실행한 직후, 세션2에서 아래와 같은 쿼리를 수행할 때, 의도치 않은 결과가 나오게 된다.


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT * FROM LOCKTAB;


세션 1에서 사과 가격을 2,000원으로 업데이트를 하려다 Rollback을 해서, 다시 1,000원이 되었다. 

세션 2에서는 롤백 전의 데이터를 읽어서, 사과 가격이 2,000원으로 남아있다. 

이와 같이 아직 커밋되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 때 발생하는 의도치 않은 데이터를 Dirty Read 현상이라고 한다.

보통 DBMS에서는 고립화 수준 레벨 1을 지향하기 때문에, 위 테스트와 같이 Isolation level을 강제로 지정하지 않는 이상 Dirty Read 현상은 발생하지 않는다. 

* 참고)

Spring에서 @Transactional 어노테이션을 통해서 Application Layer 에서도 고립화 수준을 다음과 지정해서 사용할 수 있다.


Read committed(Level 1) 이란?

-. 제목 그대로 커밋된 것 만 읽는 레벨을 말하며, 대부분의 DBMS의 기본모드이다.
-. Dirty Read 현상은 나타나지 않지만 Non-Repeatable Read 현상과 Phantom Read 현상은 발생한다.

Non-Repeatable Read 현상이란 한 트랜잭션 내에서 같은 쿼리를 두 번 수행할 때, 그 사이에 다른 트랜잭션이 값을 수정/삭제함으로써 두 쿼리의 결과가 상이하게 나타나는 현상을 말한다.

먼저 세션 1의 트랜잭션이다.

BEGIN TRAN
	SELECT * FROM LOCKTAB WHERE IDX1 = 1000

	UPDATE LOCKTAB SET PRO_VAL = PRO_VAL + 1000 WHERE IDX1 = 1000

	SELECT * FROM LOCKTAB WHERE IDX1 = 1000
COMMIT;


세션 2의 트랜잭션이다.


BEGIN TRAN
	UPDATE LOCKTAB SET PRO_VAL= PRO_VAL + 1000 WHERE IDX1 = 1000
COMMIT;


세션 1의 Update 문까지만 수행한 후, 세션 2의 트랜잭션이 Commit 까지 수행되었다.

세션 1의 두번째 Select 문에서 가져오는 idx1 의 1000인 물품 가격이 2,000원이 아닌 3,000원이 되게 된다.

이와 같이 두 쿼리의 결과가 상이하게 나타나는 비일관성 현상을 Non-Repeatable Read 이라고 한다.


Repeatable Read(Level 2) 란?

-. 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허함으로써 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴하는 것을 말한다.

-. 그러나 Phantom Read 현상은 여전히 발생한다.


Phantom Read 현상이란 한 트랜잭션 안에서 일정범위의 레코드들을 두 번 이상 읽을 때, 첫 번째 쿼리에서 없던 유령 레코드가 두 번째 쿼리에서 나타나는 현상을 말한다.

트랜잭션 도중에 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타나는 현상이다.





반응형

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

DB 튜닝에 대한 얇고 넓은 지식  (0) 2019.01.13
Tibero SQL 튜닝  (0) 2019.01.12
인덱스 구조  (2) 2018.08.02
Database I/O  (0) 2018.07.26
SQL 공유 및 재사용  (1) 2018.07.23

댓글