트랜잭션 격리 수준
기본적으로 트랜잭션은 시작과 끝 사이에서 데이터를 일관성있게 읽어들이는 것을 의미합니다.
즉 다른 세션에서 변경된다고 하더라도 커밋이 이루어질때까지 또다른 세션은 변경작업을 확인할 수 없게 됩니다.
그렇지만, 트랜잭션의 격리 수준에 따라 위의 내용은 맞지 않을 수 있습니다.
트랜잭션의 격리 수준은 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';
'Database > MySQL' 카테고리의 다른 글
[MySQL] Auto Increment 컬럼 초기화 방법과 위험성에 대해서 (0) | 2020.09.10 |
---|---|
[MySQL] Error Code 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version 에러 해결하기 (0) | 2020.09.08 |
[MySQL] 실행한 쿼리를 파일로 확인하기 (0) | 2018.10.17 |
[MySQL] 인덱스 종류 및 고려사항 (단일, 복합, 클러스터, 논클러스터, 커버드) (0) | 2018.10.17 |
[MySQL] MySQL 이중화(HA구성)하기 (0) | 2018.10.08 |