0) 공통 준비 (한 번만)

아무 세션에서 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;


1) REPEATABLE READ: “트랜잭션 시작 시점 스냅샷 고정” 테스트

핵심: A가 트랜잭션 시작 후 읽은 값은, B가 커밋해도 A에선 안 바뀜 (A 트랜잭션 끝날 때까지)

✅ 세션 A

USE isolation_test;
SET autocommit=0;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

START TRANSACTION;

SELECT balanceFROM accountWHERE id=1;-- (1) 1000 나올 것

✅ 세션 B

USE isolation_test;
SET autocommit=0;

START TRANSACTION;
UPDATE accountSET balance=500WHERE id=1;
COMMIT;

✅ 다시 세션 A (중요)

SELECT balanceFROM accountWHERE id=1;-- (2) 여전히 1000 (스냅샷 고정)
COMMIT;

✅ 세션 A 트랜잭션 끝난 뒤 다시 조회

SELECT balanceFROM accountWHERE id=1;-- (3) 이제 500 보임


2) SELECT FOR UPDATE: “읽으면서 락 걸기” 테스트

핵심: SELECT ... FOR UPDATE조회 + (해당 행) X락 → 다른 세션의 UPDATE가 대기됨.

데이터 초기화(아무 세션):