2018년 4월 27일 금요일

[PO 7.5] Transaction Isolation Level in JDBC Channel

PO/PI의 JDBC Sender/Receiver Channel에는 Transaction Isolation Level이 존재한다. 각 각의 레벨은 Dirty Reads, Non-repeatable, Phantom Reads의 허용차이가 있으며 병렬처리에 유리한 순서는
Read_uncommitted > Read_committed > Repeatabl_read > Serializable이다.
아래의 T1은 트랜잭션1이고 T2는 트랜잭션2이다.

Dirty Reads
1. T1에서 SELECT col1 FROM tab1 WHERE col2 = 1; 쿼리의 결과는 10건이 조회가 된다.
2. T2에서 UPDATE tab1 SET col1 = 10 WHERE col2 = 1; 쿼리 수행후 커밋되지 않은 상태이다.
3. T1에서 SELECT col1 FROM tab1 WHERE col2 = 1; 쿼리의 결과는 11건이 조회가 된다.

Non-repeatable
1. T1에서 SELECT col1 FROM tab1 WHERE col2 = 1; 쿼리의 결과는 10건이 조회가 된다.
2. T2에서 UPDATE tab1 SET col1 = 10 WHERE col2 = 1; 쿼리 수행 후 커밋한다.
3. SELECT col1 FROM tab1 WHERE col2 = 1; 쿼리의 결과는 11건이 조회가 된다.

Phantom Reads
1. SELECT COUNT(*) FROM tab1 WHERE col1 BETWEEN 1 AND 10; 쿼리 결과는 5건이 조회가 된다.
2. INSERT INTO tab1(col1, col2) VALUES (1, 20); 쿼리수행 후 커밋한다.
3. SELECT COUNT(*) FROM tab1 WHERE col1 BETWEEN 1 AND 10; 쿼리 결과는 6건이 조회된다.

Default
DB에 설정된 트랜잭션 레벨을 사용한다.

None
트랜잭션 레벨을 지원하지 않은 DB에 사용된다.

Read_uncommitted
Dirty Reads, Non-repeatable, Phantom Reads를 허용한다.
병렬처리에 적합하며 무결성 보장이 안될 수있다. T2에서 업데이트 후 커밋되지 않은데이터도 조회가 가능하다.

Read_committed
Non-repeatable, Phantom Reads를 허용한다. 커밋한 데이터만 조회가 되고 T1이 조회를 하는중에 T2에서 업데이트나 인서트가 되는경우 결과가 달라질수 있다.

Repeatabl_read
Phantom Reads를 허용한다. T1이 범위조건에 맞는 데이터를 조회하는 경우 T2에서 T1에서 조회 범위안에 존재하는 데이터의 업데이트는 불가능하다. 범위외에서는 인서트가 가능하다.

Serializable
Dirty Reads, Non-repeatable, Phantom Reads 허용하지 않는다.
속도는 느리지만 직렬처리에 적합하다. T1이 조회하는 중에는 T2에서는 업데이트나 인서트가 불가능하다.

Reference(참조)
SQL TRANSACTION ISOLATION LEVELS EXPLAINED
Isolation level
blog.inspien.co.kr/54

댓글 없음:

댓글 쓰기