1. 데이터베이스 Isolation Level 이란

트랜잭션에서 일관성 없는 데이터를 허용하는 수준

 

 

2. Isolation Level 의 종류

- Read Uncommitted

- Read Commited

- Repeatable Read

- Serializable

Read Uncommitted -> Serializable 로 갈 수록 격리수준이 높다(high)

Serializable -> Read Uncommitted 로 갈 수록 격리수준이 낮다(low)

1) Read Uncommitted
- SELECT 문장 수행시 해당 데이터에 Shared Lock 이 걸리지 않는 Level
- 아직 commit 되지 않은 트랜잭션 A 의 데이터를 B가 SELECT 할 수 있음
발생하는 문제 : dirty read, non-repeatable read, phantom read

2) Read Commited
- Select 문장이 수행되는 동안 데이터에 Shared Lock 이 걸린다
- 아직 commit 되지 않은 트랜잭션 A 의 데이터를 B가 SELECT 할 수 없다
발생하는 문제 : non-repeatable read, phantom read

3) Repeatable Read
- 트랜잭션 A가 시작되기 전에 커밋된 내용까지만 조회할 수 있다.
- 자신의 트랜잭션 보다 낮은 트랜잭션에서 커밋된 것만 읽는다.
(모든 InnoDB의 트랜잭션은 고유한 트랜잭션 시퀀스를 가지고 있으며 Undo 영역에 백업된 모든 레코드는 변경을 발생시킨 트랜잭션의 번호가 포함되어 있다)
발생하는 문제 : phantom read

4) Serializable
- 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당되는 영역에 대한 수정 및 입력을 할 수 없다.
- 완벽한 LOCK 을 건다.

 

3. 격리 수준에 따라 나타나는 현상

3-1) Dirty Read

1) 트랜잭션 A 에서 값을 넣는다. insert into user (seq, gender, name) values (1, 'M', 'pyo');

2) 트랜잭션 B 에서 값을 읽는다. select * from user where seq = 1;

3) 트랜잭션 A 에서 insert 했던 값을 롤백한다. 

4) 트랜잭션 B 에서 읽어놓은 값은 실제로 DB에 존재하지 않는 데이터가 돼버린다. (dirty 하다)

 

3-2) Non-repeatable Read

1) 트랜잭션 A 에서 값을 읽는다. select gender, name from user where seq = 1;

    result : M pyo

2) 트랜잭션 B 에서 값을 넣는다. update user set gender = 'W' where seq = 1;

3) 트랜잭션 B 에서 commit 한다.

4) 트랜잭션 A 에서 값을 읽는다. select gender, name from user where seq = 1;

    result : W pyo

    남자였던 pyo 가 여자가 되었다. 위처럼 반복해서 동일한 데이터를 읽을 경우 상이한 결과가 나온다.

 

3-3) Phantom Read

1) 트랜잭션 A 에서 범위(range) 기준으로 값을 읽는다.

2) 트랜잭션 B 에서 1)에 포함되는 값을 넣는다.

3) 트랜잭션 B 에서 commit 한다.

4) 트랜잭션 A 에서 범위(range) 기준으로 값을 읽는다.

   result : 1)에서 읽히지 않은 값이 결과로 나온다 

 

Isolation Level Dirty Read NonRepeatable Read Phantom Read
Read Uncommitted Permitted Permitted Permitted
Read Commited - Permitted Permitted
Repeatable Read - - Permitted
Serializable - - -

 

 Non-repeatable read vs Phantom read

Non-repeatable read 와 Phantom read 의 차이

 

※ 엔진별 Default Isolation Level

- Mysql InnoDB 엔진 : Repeatable-Read 

- Oracle : Read-Commited

 

 

4. isolation level 지정하기

1) sql에서의 isolation level 지정

SET TRANSACTION ISOLATION LEVEL 
   { READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE }

2) spring transaction 에서의 isolation level 지정

예제 참고

 

 

참고 :

영문으로 되어 있는 설명

그림으로 설명이 잘 되어 있는 곳

sql 코드로 설명이 잘 되어 있는 곳

mysql 공식문서

 

반응형

'DB' 카테고리의 다른 글

[DB] InnoDB vs MyISAM : InnoDB와 MyISAM의 차이점  (0) 2020.08.18

+ Recent posts