송금을 위한 트랜잭션이 정상 처리되면
데이터를 영구 반영하기 위해 COMMIT !
T1. SELECT 이름 FROM 계좌정보 WHERE 이름 = ‘김민수’ AND 계좌번호 = ‘A계좌’ ;
T2. SELECT 이름 FROM 계좌정보 WHERE 이름 = ‘김영희’ AND 계좌번호 = ‘B계좌’ ;
T3. SELECT 잔액 FROM 계좌정보 WHERE 계좌번호 = ‘A계좌’ AND 잔액 >= 1,000,000 ;
T4. UPDATE 계좌정보 SET 잔액 = 잔액 -1,000,000 WHERE 계좌번호 = ‘A계좌’ ;
T5. UPDATE 계좌정보 SET 잔액 = 잔액+1,000,000 WHERE 계좌번호 = ‘B계좌’ ;
COMMIT; ( 송금 업무를 위한 일련의 절차가 정상 처리되었으니 데이터 영구반영 )
BUT!!
만약 트랜잭션 도중에 오류가 발생한다면
트랜잭션 오류!! 현재까지 실행된 트랜잭션 취소 요구!!!
↓
트랜잭션 도중에 하나라도 오류가 발생하면
이전에 했던 모든 활동 ROLLBACK
(김영희씨와 계좌 송금 1건에 관련하여 이루어진 트랜잭션은 모두 ROLLBACK)
COMMIT ;
마지막 COMMIT 시점 이후 실행한 트랜잭션 결과를 데이터베이스에 영구 저장
ROLLBACK ;
실행한 트랜잭션 결과에 대해서 실행하기 전 상태로 원상복구
마지막으로 COMMIT 한 시점까지만 ROLLBACK 가능
보통 DML (UPDATE , INSERT ,DELETE) 한 대상은 바로 테이블에
영구 반영되는 것이 아니므로 COMMIT 을 명시해야 반영
참고 URL : 링크
ROLLBACK 명령어에 대해 특정 지점까지만 복구하도록 조절.
실무에서는 잘 사용 안함.
--오라클의 세이브 포인트 지정
savepoint 포인트명;
--오라클의 세이브 포인트 불러오기
rollback to 포인트명;
상세 정보 : 링크
Lock들의 경합(Race condition) 이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰선 상태
-> 먼저 Lock 을 설정한 트랜잭션을 기다려야하기 때문에, 이런 현상 반복시 빠른 서비스를 제공할 수 없다.
LOCK은 둘 이상의 세션이
똑같은 행을 조작하려고 할 때 충돌하는 현상 (베타 LOCK)
서로 다른 행을 조작한다면 LOCK이 발생하지 않으니 괜찮지만,
DML 작업 시 미리 협의하는 것이 중요
그럼에도 불구하고 LOCK에 걸렸다면?
→ 트랜잭션이 작업을 진행하지 못하고 멈추는 현상 발생 (BLOCKING)