아무 세션에서 1번만 실행
DROP DATABASE IFEXISTS isolation_test;
CREATE DATABASE isolation_test;
USE isolation_test;
CREATE TABLE account (
idINTPRIMARY KEY,
balanceINTNOT NULL,
versionINTNOT NULLDEFAULT0
) ENGINE=InnoDB;
INSERT INTO account(id, balance, version)VALUES (1,1000,0);
확인:
SELECT @@transaction_isolation;-- 보통 REPEATABLE-READ
SELECT*FROM account;
핵심: A가 트랜잭션 시작 후 읽은 값은, B가 커밋해도 A에선 안 바뀜 (A 트랜잭션 끝날 때까지)
USE isolation_test;
SET autocommit=0;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT balanceFROM accountWHERE id=1;-- (1) 1000 나올 것
USE isolation_test;
SET autocommit=0;
START TRANSACTION;
UPDATE accountSET balance=500WHERE id=1;
COMMIT;
SELECT balanceFROM accountWHERE id=1;-- (2) 여전히 1000 (스냅샷 고정)
COMMIT;
SELECT balanceFROM accountWHERE id=1;-- (3) 이제 500 보임
핵심: SELECT ... FOR UPDATE는 조회 + (해당 행) X락 → 다른 세션의 UPDATE가 대기됨.
데이터 초기화(아무 세션):