Transaction Isolation Level은 트랜잭션이 동시에 변경하고 쿼리를 수행할 때 성능, 안전성, 일관성, 결과 재현성 사이의 균형을 조정하는 설정이다.
4단계로 나뉘며 위에 있을 수록 동시성 처리에 유리하고 아래에 있을 수록 데이터 정합성이 높다.
테스트는 MySQL + workbench로 했으며 workbench은 세션(탭)을 2개 띄워서 사용했음.
샘플로 사용할 iso_tb다.
// 두 세션 각각 실행하여 격리레벨을 바꾸기
set session transaction isolation level READ UNCOMMITTED;
// 격리 레벨 확인
select @@session.transaction_isolation;
//1번 세션에서
START TRANSACTION;
UPDATE iso_tb SET name = '판교' WHERE seq = 1;
// 2번 세션에서 -> saq = 1이 강남이 판교로 보임.
START TRANSACTION;
SELECT * FROM iso_tb;
//1번 세션에서
ROLLBACK; //반드시 롤백해야함
// 2번 세션에서 -> seq = 1이 다시 강남으로 보임.
SELECT * FROM iso_tb;
COMMIT;
// 두 세션 각각 실행하여 격리레벨을 바꾸기
set session transaction isolation level READ COMMITTED;
// 격리 레벨 확인
select @@session.transaction_isolation;
//1번 세션에서
START TRANSACTION;
UPDATE iso_tb SET name = '판교' WHERE seq = 1;
// 2번 세션에서 -> 커밋 전이라 saq = 1이 강남이 변경된 판교로 보이지 않음.
START TRANSACTION;
SELECT * FROM iso_tb;
//1번 세션에서
COMMIT;
// 2번 세션에서 -> 커밋 후라 saq = 1이 강남이 판교로 보임.
SELECT * FROM iso_tb;
//2번 세션에서
COMMIT;
// 두 세션 각각 실행하여 격리레벨을 바꾸기
set session transaction isolation level REPEATABLE READ;
// 격리 레벨 확인
select @@session.transaction_isolation;
//1번 세션에서
start TRANSACTION;
UPDATE iso_tb SET name = '판교' WHERE seq = 1;
//2번 세션에서 -> seq = 1이 강남이 변경된 판교로 보이지 않음.
start TRANSACTION;
SELECT * FROM iso_tb;
//1번 세션에서
COMMIT;
// 2번 세션에서 -> 커밋을 해도 saq = 1이 강남이 변경된 판교로 보이지 않음.
SELECT * FROM iso_tb;
COMMIT;
// 2번 세션에서 -> 이제 saq = 1이 강남이 변경된 판교로 보임.
SELECT * FROM iso_tb;
// 두 세션 각각 실행하여 격리레벨을 바꾸기
set session transaction isolation level SERIALIZABLE;
// 격리 레벨 확인
select @@session.transaction_isolation;
//2번 세션에서
START TRANSACTION;
SELECT * FROM iso_tb;
//1번 세션에서 -> 2번 세션에서 lock을 획득하고 있어서 변경이 안되고 대기.
START TRANSACTION;
UPDATE iso_tb SET name = '판교' WHERE seq = 1;
// 2번 세션에서 -> 1번 세션 변경사항 적용됨.
COMMIT;
// 1번 세션에서
COMMIT;
한 줄평 : MySQL에 따르면 REPEATABLE READ > READ COMMITTED > READ UNCOMMITTED > SERIALIZABLE 순서로 많이 쓴다고 한다.
참고 -
https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html