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 지정
참고 :
'DB' 카테고리의 다른 글
[DB] InnoDB vs MyISAM : InnoDB와 MyISAM의 차이점 (0) | 2020.08.18 |
---|