용어 설명
1. Dirty Read
어떤 트렌젝션이 데이타를 변경하고, COMMIT을 하지 않았을때도, 다른 트렌젝션에서 그 값을 읽으면 변경된 값이 반영되는 경우이다.
1) TX_A가 시작되고, SELECT NAME FROM TABLE_A WHERE ID=1에서 ORIGIN이 출력되었다고 가정하자.
2) TX_B에서 UPDATE TABLE_A SET NAME=”CHANGED” WHERE ID =1 를 실행한후
3) TX_A가 시작되고, SELECT NAME FROM TABLE_A WHERE ID=1에서 CHANGED가 출력된다.
즉 2)에서 UPDATE한 내용을 COMMIT하지 않았는데도 반영이 되면 이를 Dirty Read라고 한다.
2. NonRepeatable Read (Fuzzy Read)
어떤 트렌젝션이 데이타를 변경 (update와 delete만 해당됨)하고, COMMIT을 하면, COMMIT된 내용은 다른 트렌젝션에 반영된다.insert된 내용은 반영되지 않는다.
1) TX_A가 시작되고, SELECT NAME FROM TABLE_A WHERE ID=1에서 ORIGIN이 출력되었다고 가정하자.
2) TX_B에서 UPDATE TABLE_A SET NAME=”CHANGED” WHERE ID =1 를 실행한후
3) TX_A에서 SELECT NAME FROM TABLE_A WHERE ID=1하면 ORIGIN이 출력된다.
4) TX_B를 COMMIT한후
5) SELECT NAME FROM TABLE_A WHERE ID=1하면 CHAGNED가 출력된다.
3. Phantom Read
어떤 트렌젝션이 새로운 데이트를 삽입(Insert)하고, COMMIT하면, COMMIT된 내용은 다른 트렌젝션에 반영된다. (NonRepeatable read와 같으나, NonRepetable을 update,delete가, Phantom Read는 insert된 내용이 반영된다.)
1) TX_A가 시작되고, SELECT COUNT(*) FROM TABLE_A WHERE GRP=1에서 10이 출력되었다고 가정하자.
2) TX_B에서 INSERT INTO TABLE_A (ID,GRP) VALUES(100,1);
3) TX_A에서 SELECT COUNT(*) FROM TABLE_A WHERE GRP=1하면 10 이 출력된다.
4) TX_B를 COMMIT한후
5) TX_A에서 SELECT COUNT(*) FROM TABLE_A WHERE GRP=1하면 11 이 출력된다
Isolation Level
ANSI/ISO SQL 표준 (SQL92)에서는 4가지 Isolation Level을 지원하는데. 그 내용은 간단하게 다음과 같은 표로 정리된다.
Isolation Level
|
Dirty Read
|
NonRepetable Read
|
Phantom Read
|
Read uncommitted
|
Possible
|
Possible
|
Possible
|
Read committed
|
Not Possible
|
Possible
|
Possible
|
Repetable read
|
Not Possible
|
Not Possible
|
Possible
|
Serializable
|
Not Possible
|
Not Possible
|
Not Possible
|
How to setup Oracle and Java Isolation Level
많이 사용하고있는 Oracle DBMS의 경우에는 Default가 Read Commited로 설정이 되어 있으며, Oracle 9(현재)까지, Isolation Level은 Read commited와, Serializable 두가지만 지원하고 있다.
Oracle에서 Isolation Level을 변경하는 방법은 SQL PLUS에서 LEVEL에 따라서 다음과 같은 명령어를 치면된다.
SET TRANSACTION ISOLATION LEVEL READ COMMITED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
아래 사이트에서 발췌...