Database/MySQL

[MySQL] 트랜잭션 격리 수준, 레벨

꽁담 2018. 10. 18. 16:20

트랜잭션 격리 수준


기본적으로 트랜잭션은 시작과 끝 사이에서 데이터를 일관성있게 읽어들이는 것을 의미합니다.

즉 다른 세션에서 변경된다고 하더라도 커밋이 이루어질때까지 또다른 세션은 변경작업을 확인할 수 없게 됩니다.


그렇지만, 트랜잭션의 격리 수준에 따라 위의 내용은 맞지 않을 수 있습니다.

트랜잭션의 격리 수준은 4 단계로 이루어 집니다.


트랜잭션 레벨은 아래에서 확인할 수 있습니다.

mysql> show variables like 'tx_isolation';
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| tx_isolation  | READ-UNCOMMITTED |
+---------------+------------------+
1 row in set (0.00 sec)



Read Uncommitted ( 트렌젝션 레벨 0 )


트랜잭션을 수행한 세션이 커밋하기 전, 다른 세션에서 변경한 내용을 확인 할 수 있습니다.

더티 리드를 가능하게 하는 격리수준입니다.


트랜잭션 레벨을 0 으로 설정하는 방법입니다.

set tx_isolation = 'READ-UNCOMMITTED';

 설명

 세션 1

 세션 2

 트랜잭션 레벨 설정

 session1-mysql> set tx_isolation = 'READ-UNCOMMITTED';

 session2-mysql> set tx_isolation = 'READ-UNCOMMITTED';

 트랜잭션 시작

 session1-mysql> start transaction;

 session2-mysql> start transaction;

 session1 데이터 적재

 session1-mysql> insert into t1 values (1, 1);

 

 session2 데이터 조회

 

 session2-mysql> select * from t1;

+------+------+

| c1   | c2   |

+------+------+

|    1 |    1 |

+------+------+

 session1 데이터 삭제

 session1-mysql> delete from t1;

 

 session2 데이터 조회

 

 session2-mysql> select * from t1;

Empty set (0.00 sec)




Read Committed ( 트랜잭션 레벨 1 )


일반적인 RDBMS 에서 지원하는 트랜잭션 레벨입니다.


트랜잭션을 수행한 세션이 커밋할 때까지, 다른 세션에서는 변경한 내용을 조회하거나 같은 레코드를 변경할 수 없습니다.

Unrepeatable Read 가 발생할 수 있습니다.


트랜잭션 레벨을 1 로 설정하는 방법입니다.

set tx_isolation = 'READ-COMMITTED';


 설명

 세션 1

 세션 2

 트랜잭션 레벨 설정

 session1-mysql> set tx_isolation = 'READ-COMMITTED';

 session2-mysql> set tx_isolation = 'READ-COMMITTED';

 트랜잭션 시작

 session1-mysql> start transaction;

 session2-mysql> start transaction;

 session1 데이터 적재

 session1-mysql> insert into t1 values (1, 1);

 

 session2 데이터 조회

 

 session2-mysql> select * from t1;

Empty set (0.00 sec)

 session1 커밋

 session1-mysql> commit;

 

 session2 데이터 조회

 

 session2-mysql> select * from t1;

+------+------+

| c1   | c2   |

+------+------+

|    1 |    1 |

+------+------+



Unrepeatable Read 란?


트랜잭션 시작 후, 반복적인 조회작업에서 다른 트랜잭션에서 데이터가 변경되는 경우, 조회 시 데이터가 일치하지 않는 문제가 발생하는 현상을 말합니다.




Repeatable Read ( 트랜잭션 레벨 2 )


트랜잭션 내에서 다른 트랜잭션이 데이터를 변경 및 커밋했더라도, 트랜잭션 시작 시점의 데이터를 보여주는 트랜젝션 레벨입니다.

Phantom Read 가 발생할 수 있습니다.


트랜잭션 레벨을 2 로 설정하는 방법입니다.

set tx_isolation = 'REPEATABLE-READ';

 설명

 세션 1

 세션 2

 트랜잭션 레벨 설정

 session1-mysql> set tx_isolation = 'REPEATABLE-READ';

 session2-mysql> set tx_isolation = 'REPEATABLE-READ';

 트랜잭션 시작

 session1-mysql> start transaction;

 session2-mysql> start transaction;

 session1 데이터 적재

 session1-mysql> select * from t1;

+------+------+

| c1   | c2   |

+------+------+

|    1 |    1 |

+------+------+

 

 session2 데이터 적재&커밋

 

 session2-mysql> insert into t1 values (2, 2);

 session2-mysql> commit;

 session1 조회

 session1-mysql> select * from t1;

+------+------+

| c1   | c2   |

+------+------+

|    1 |    1 |

+------+------+

 



Phantom Read 란 ?


Unrepeatable Read 에서는 데이터의 변경, 삭제, 추가 작업이 가능합니다.

반면 Phantom Read 는 데이터 변경, 삭제는 불가능 하지만 데이터 추가는 가능합니다.


추가가 가능하기 때문에, 트랜잭션 시작 후, 반복적인 조회작업에서 다른 트랜잭션에서 데이터가 추가되는 경우, 조회 시 데이터가 일치하지 않는 문제가 발생하는 한 현상을 말합니다.




Serializable Read ( 트랜잭션 레벨 3 )


선행 트랜잭션이 테이블을 읽은 경우, 해당 테이블에 다른 트랜잭션이 데이터 변경, 삭제, 추가 작업을 하지 못하도록 막습니다.

완벽한 일관성을 제공합니다.


트랜잭션 레벨을 3으로 설정하는 방법입니다.

set tx_isolation = 'SERIALIZABLE';