1. TCL


1.1. 트랜잭션 이해하기

송금을 위한 트랜잭션이 정상 처리되면
	데이터를 영구 반영하기 위해 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)

1.2. COMMIT 과 ROLLBACK

  • COMMIT ;
    마지막 COMMIT 시점 이후 실행한 트랜잭션 결과를 데이터베이스에 영구 저장

  • ROLLBACK ;
    실행한 트랜잭션 결과에 대해서 실행하기 전 상태로 원상복구
    마지막으로 COMMIT 한 시점까지만 ROLLBACK 가능
    보통 DML (UPDATE , INSERT ,DELETE) 한 대상은 바로 테이블에
    영구 반영되는 것이 아니므로 COMMIT 을 명시해야 반영

  • 변경을 가한 세션에서는 데이터 내용이 변경된 것처럼 보이지만
    아직 데이터베이스에 영구반영 된 것이 아니기 때문에(COMMIT 이전) 다른 세션에서는 이전 값 출력

  • ROLLBACK은 내가 작업한 내용을 되돌리는 것이므로 다른 세션에서 확인 X
  • 만약, COMMIT을 해버리면 되돌릴 수 없으므로 트랜잭션 순서를 거슬러 올라가며 데이터 복구

1.3. SAVEPOINT (시험예상)

참고 URL : 링크
ROLLBACK 명령어에 대해 특정 지점까지만 복구하도록 조절.
실무에서는 잘 사용 안함.

--오라클의 세이브 포인트 지정
 savepoint 포인트명;

--오라클의 세이브 포인트 불러오기
 rollback to 포인트명;


1.4. LOCK

상세 정보 : 링크
Lock들의 경합(Race condition) 이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰선 상태

-> 먼저 Lock 을 설정한 트랜잭션을 기다려야하기 때문에, 이런 현상 반복시 빠른 서비스를 제공할 수 없다.

  • LOCK은 둘 이상의 세션이
    똑같은 행을 조작하려고 할 때 충돌하는 현상 (베타 LOCK)

  • 서로 다른 행을 조작한다면 LOCK이 발생하지 않으니 괜찮지만,
    DML 작업 시 미리 협의하는 것이 중요

  • 그럼에도 불구하고 LOCK에 걸렸다면?
    → 트랜잭션이 작업을 진행하지 못하고 멈추는 현상 발생 (BLOCKING)

profile
제가 한 번 해보겠습니다.

0개의 댓글