실제로 은행에서 트랜잭션 수행하는 과정이 어떻게 이루어 지는지 예시로 확인해보자!
1. 김민수라는 사람의 A계좌가 존재하는지 확인 →
SELECT 이름 FROM 계좌정보 WHERE 이름 = ‘김민수’ AND 계좌번호 = ‘A계좌’ ;
2. 김영희라는 사람의 B계좌가 존재하는지 확인 →
SELECT 이름 FROM 계좌정보 WHERE 이름 = ‘김영희’ AND 계좌번호 = ‘B계좌’ ;
3. 김민수의 A계좌에 잔액이 일백만원 이상인지 확인 →
SELECT 잔액 FROM 계좌정보 WHERE 계좌번호 = ‘A계좌’ AND 잔액 >= 1,000,000 ;
4. 김민수의 A계좌 잔액에서 일백만원을 차감 →
UPDATE 계좌정보 SET 잔액 = 잔액 -1,000,000 WHERE 계좌번호 = ‘A계좌’ ;
5. 김영희의 B계좌 잔액에서 일백만원을 추가 →
UPDATE 계좌정보 SET 잔액 = 잔액+1,000,000 WHERE 계좌번호 = ‘B계좌’ ;
6. 송금 업무가 완료 → COMMIT;
3. 김민수의 A계좌에 잔액이 일백만원 이상인지 확인
→ SELECT 잔액 FROM 계좌정보 WHERE 계좌번호 = ‘A계좌’ AND 잔액 >= 1,000,000 ;
하나라도 오류가 발생한다면 이전에 했던 모든 활동을 ROLLBACK해야한다. →
ROLLBACK;
COMMIT ;
→ 마지막 COMMIT 시점 이후 실행한 트랜잭션 결과를 데이터베이스에 영구 저장
ROLLBACK ;
→ 실행한 트랜잭션 결과에 대해서 실행하기 전 상태로 원상복구
→ 마지막으로 COMMIT 한 시점까지만 ROLLBACK 가능
보통 DML (UPDATE , INSERT ,DELETE) 한 대상은 바로 테이블에
영구 반영되는 것이 아니므로 COMMIT 을 명시해야 반영
그럼에도 불구하고 LOCK에 걸렸다면?
→ 트랜잭션이 작업을 진행하지 못하고 멈추는 현상 발생 (BLOCKING)
LOCK 해제방법
1. 원인이 되는 세션에서 COMMIT 혹은 ROLLBACK 을 실행 (LOCK = 자물쇠 , COMMIT/ROLLBACK = 열쇠)
2. DBA 에게 가서 LOCK을 풀어달라고 요청
3. LOCK 및 세션의 KILL 방법을 조회해 직접 세션 kill 실행
→ 이런 경합은 성능에 좋지 않으니 최소화!