Programming/JDBC

호박고구메 2015. 2. 17. 04:40

1. 차단레벨


차단레벨(Isolatino Level)

dirty read

non-repeatable read

phantom read

TRANSACTION_READ_UNCOMMITTED

O

O

O

TRANSACTION_READ_COMMITTED

X

O

O

TRANSACTION_REPEATABLE_READ

X

X

O(X)

TRANSACTION_SEREALIZBLE

X

X

X



2. Connection 인터페이스에서 트랜잭션 차단 레벨과 관련된 필드


필드

설명

상수 값

static final int TRANSACTION_NONE

트랜잭션이 지원되지 않음을 나타내는 상수

0

static final int TRANSACTION_READ_UNCOMMITTED

dirty read, non-repeatable read와 phantom read가 발생할 수 있음을 나타내는 상수

1

static final int TRANSACTION_READ_COMMITTED

dirty read는 금지되고, non-repeatable read와 phantom read는 발생할 수 있음을 나타내는 상수

2

static final int TRANSACTION_REPEATABLE_READ

dirty read와 non-repeatable read는 금지되고, phantomread는 발생할 수 있음을 나타내는 상수

3

static final int TRANSACTION_SEREALIZBLE

dirty read, non-repeatable read와 phantom read가 모두 금지됨을 나타내는 상수

4




3. 트랜잭션 차단 레벨과 고나련된 Connection 인터페이스의 메소드


필드

설명

int getTransactionIsolation()

현재 Connection 객체의 트랜잭션 차단 레벨 값을 반환한다

void setTransactionIsolation(int level)

매개변수로 주어진 level 값으로 해당 Connection의 트랜잭션 차단 레벨을 변경한다.




4. 용어설명


* Dirty read

 한 트랜잭션 T1이 테이블의 행을 갱신하고 아직 commit이 수행되지 않은 상태에서, 다른 트랜잭션 T2가 그 테이블의 행을 읽으려고 하는 경우, T1에서 commit() 메소드가 수행되지 않더라도 T2의 질문에서 T1의 갱신된 행의 데이터값으로 읽혀지는것을 말한다.


쉽게 말하면 이런 형태이다.


T1 -> A테이블 갱신

T2 -> A테이블 조회

T1 -> commit


이런 순서로 트랜잭션이 진행될경우 Dirty read가 허용이 되어있으면 commit 전이지만 T2에는 T1의 수행결과가 포함된 정보가 오는것이고, 허용되지 않을경우에는 T1의 수행결과는 오지 않는 것이다.



* non-repeatable read

 트랜잭션 T1이 행의 값을 읽어오고, 다른 트랜잭션 T2가 그 행의 값을 변경하고 commit한 후 트랜잭션 T1이 다시 그 행의 ㄱ밧을 읽게되면 처음 검색결과와 다른 검색결과가 나오는것이다.



* phantom read

 트랜잭션 T1이 동일한 조건으로 여러번 읽기를 하는 경우, 중간에 다른 트랜잭션 T2에 의해 동일 조건으로 추가한 값을 읽을 수 있는 경우를 말한다. 즉 트랜잭션 T1이 특정조건으로 행의 정보를 검색하고, 중간에 다른 트랜잭션 T2가 동일 조건의 행을 추가하고 commit을 수행한 다음, 트랜잭션 T1이 동일한 조건으로 다시 행의 정보를 검색한 경우 중간에 추가된 행의 정보를 읽을 수 있는 것을 의미한다.