-- [SQL-9-2-6-a] A 세션
-- A 세션
-- 1. ACC1의 잔액 5,000원으로 초기화
UPDATE startdbpg.ms_acc t1
SET bal_amt = 5000
WHERE t1.acc_no = 'ACC1';
-- 2. A 세션 명시적 트랜잭션 시작
BEGIN;
-- 4. SELECT FOR UPDATE로 잔액 조회(5,000원)
SELECT t1.bal_amt FROM startdbpg.ms_acc t1
WHERE t1.acc_no = 'ACC1'
FOR UPDATE;
-- 6. ACC1에서 500원 출금
UPDATE startdbpg.ms_acc t1
SET bal_amt = bal_amt-500
WHERE t1.acc_no = 'ACC1';
-- 7. ACC1 잔액 조회(4,500원)
SELECT t1.bal_amt FROM startdbpg.ms_acc t1
WHERE t1.acc_no = 'ACC1';
-- 8. 변경된 데이터 반영
COMMIT;
SQL
복사
-- [SQL-9-2-6-a] B 세션
-- B 세션
-- 3. B 세션 명시적 트랜잭션 시작
BEGIN;
-- 5. SELECT FOR UPDATE로 잔액 조회
-- A 세션이 커밋할 때까지 대기에 빠짐
-- A 세션이 커밋 후 4,500원이 조회된다.
SELECT t1.bal_amt FROM startdbpg.ms_acc t1
WHERE t1.acc_no = 'ACC1'
FOR UPDATE;
-- 9. ACC1에서 500원 출금
UPDATE startdbpg.ms_acc t1
SET bal_amt = bal_amt-500
WHERE t1.acc_no = 'ACC1';
-- 10. ACC1 잔액 조회(4,000원)
-- B 세션이 처음 조회(5번 SQL)한 잔액은 4,500원
-- 500원 출금했으므로 4,000원은 정상적인 결과
SELECT t1.bal_amt FROM startdbpg.ms_acc t1
WHERE t1.acc_no = 'ACC1';
-- 11. 변경된 데이터 반영
COMMIT;
SQL
복사
