Search

9-2-6. SELECT FOR UPDATE

-- [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
복사