[Database]Isolation level 파헤치기 - 서로 다른 isolation level을 가진 transaction들은 어떻게 동작할까?

2021. 4. 11. 03:00 Database/mysql

하지만 해당 글의 예제에서는

transaction의 isolation level을 

동일하게 설정하고 설명을 진행했습니다. 

 

'그렇다면 서로 다른 isolation level을 가진 transaction들은 어떻게 동작할까?'

라는 의문이 들었고

 

이번 글에서는 이를 실험해 본 결과를 정리하려고 합니다.

 

참고로, 이번에는 MySQL이 아닌,

MSSQL을 이용하여 예제를 진행하였습니다.

 

처음에는 같은 isolation level(READ COMMITTED)의

두 transaction이 어떻게 동작하는지 먼저 살펴보겠습니다.

 

#write transaction
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
INSERT INTO "dbo"."isolation_test" VALUES(0, GETDATE(), 100)

#read transaction
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM "dbo"."isolation_test"
#결과 읽어오지 못함

 

예상했던 것처럼 commit하지 않은 데이터는

읽어오지 못했습니다.

 

이번에는 두 transaction의 isolation level을

다르게 설정해보겠습니다.

 

#write transaction
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
INSERT INTO "dbo"."isolation_test" VALUES(0, GETDATE(), 100)

#read transaction
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM "dbo"."isolation_test"
#결과 읽어오지 못함

 

write transaction의 isolation level은 READ UNCOMMITTED이지만

read transaction은 여전히 값을 읽어오지 못하고 있습니다.

 

이를 통해 isolation level의 기준은

(isolation level의 명칭에서('READ' COMMITTED) 유추해 낼 수 있는 내용일 수 있지만)

read(조회)를 수행하는 transaction에 있다는 것을 알 수 있었습니다.

 

이를 검증하기 위해

이번에는 반대로 isolation level을 설정하고

똑같은 동작을 수행해보겠습니다.

 

#write transaction
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
INSERT INTO "dbo"."isolation_test" VALUES(0, GETDATE(), 100)

#read transaction
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM "dbo"."isolation_test"
#결과 읽어오기 성공
+------+-------------------------+---------+
| id   | createDatetime          | value   |
|------+-------------------------+---------|
| 0    | 2020-02-28 22:42:30.360 | 100     |
+------+-------------------------+---------+

 

우리가 예상했던 것처럼

문제없이 데이터를 읽어왔습니다.

 

잘못된 점이 있거나 궁금한 점이 있으면 댓글 부탁드립니다!

 

출처 : devonce.tistory.com/32?category=851581