[SQLD] TCL

영태·2022년 8월 19일
0

[SQLD]

목록 보기
7/7

TCL(TRANSACTION CONTROL LANGUAGE)

  1. 트랜잭션 개요

    • 데이터베이스의 논리적 작업 단위를 구성하는 세부적인 연산들의 집합
    • 밀접하게 연관되어 분리될 수 없는 한개 이상의 데이터베이스 조작
    • 분할할 수 없는 최소의 단위(전부 적용하거나 전부 취소한다)
      • ALL or Nothing
    • 커밋(COMMIT)
      • 올바르게 반영된 데이터를 데이터베이스에 반영시키는것
    • 롤백(ROLLBACK)
      • 트랜잭션 시작 이전의 상태로 되돌리는 것
    • 저장점(SAVEPOINT)
    • 트랜잭션의 대상 : DML문
    • SELECT는 직접적인 트랜잭션의 대상은 아니지만 SELECT FOR UPDATE 와 같이 배타적 LOCK을 요구하는 SELECT는 트랜잭션의 대상이 될수 있다
    • 트랜잭션의 특성
      • 원자성 : 실패하면 이전으로 되돌린다
      • 일관성 : 트랜잭션 이전의 db가 문제가 없다면 이후에도 문제가 생기면 안된다
      • 고립성 : 트랜잭션이 실행되는 중 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다
      • 지속성 : 성공하면 데이터베이스의 내용은 영구적으로 저장된다
    • LOCKING
      • 트랜잭션을 수행하는 동안 특정 데이터에 대해서 다른 트랜잭션이 동시에 접근 못하도록 제한하는 기법
      • 트랜잭션의 특성을 충족하기 위해 다양한 레벨의 락킹을 제공한다
      • 락이 걸린 데이터는 락을 실행한 트랜잭션만 독점적으로 접근할 수 있다
      • 락이 걸린 데이터는 락을 수행한 트랜잭션만이 해제할수 있다
  2. COMMIT

    • 입력,수정,삭제한 자료에 대해 전혀 문제가 없다고 판단했을 경우 COMMIT을 통해 트랜잭션을 완료한다
    • COMMIT,ROLLBACK 이전의 데이터 상태
      • 메모리 버퍼에만 영향을 받는다
      • 따라서 데이터 변경 이전 상태로 복구가 가능하다
      • 현재 사용자는 SELECT 문장으로 결과를 확인 가능하다
      • 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없다
      • 변경된 행은 락이 설정되어서 다른 사용자가 변경할 수 없다
    • 커밋 이후의 데이터 상태
      • 데이터에 대한 변경 사항이 데이터베이스에 반영된다
      • 수정 or 삭제시,이전 데이터는 영원히 잃어버리게 된다
      • 모든 사용자가 결과를 볼 수 있다
      • 관련된 행에 대한 락이 풀린다. 다른 사용자들이 행을 조작할 수 있게 된다
    • 예문
    INSERT INTO PLAYER
    VALUES ('3','이운재','GK',182,82);
    COMMIT;
    • SQL 서버에서의 커밋
      • 기본적으로 AUTO-COMMIT 모드다
      • DML 수행 후 사용자가 COMMIT 혹은 ROLLBACK을 처리할 필요가 없다
      • DML 구문이 성공이면 자동으로 COMMIT된다
      • 오류일 경우 자동으로 ROLLBACK된다
    • AUTO COMMIT
      • DML,DDL을 수행할 떄마다 성공하면 자동으로 COMMIT한다
      • 오류가 발생하면 자동으로 ROLLBACK 한다
    • 암시적 트랜잭션
      • 오라클처럼 처리된다
      • 트랜잭션의 시작은 DBMS가 처리한다
      • 트랜잭션의 끝은 사용자가 명시적으로 COMMIT 혹은 ROLLBACK으로 처리한다
      • 인스턴스 단위 또는 세션 단위로 설정할 수 있다
        • 인스턴스 단위
          • 기본연결 옵션의 암시적 트랜잭션 체크
        • 세션 단위
          • 세션 옵션 중 SET IMPLICIT TRANSACTION ON 사용
    • 명시적 트랜잭션
      • 시작과 끝을 모두 사용자가 명시적으로 지정하는 방식이다
      • BEGIN TRANSACTION으로 트랜잭션을 시작
      • COMMIT TRANSACTION or ROLLBACK TRANSACTION으로 트랜잭션을 종료한다
      • ROLLBACK 구문을 만나면 최초의 BEGIN TRANSACTION까지의 시점까지 모두 롤백된다
  3. ROLLBACK

    • 입력,수정,삭제한 데이터에 대하여 커밋 이전의 변경사항을 취소한다
    • 변경 이전 상태로 복구된다
    • 관련된 행에 대한 락이 풀리고 다른 사용자가 사용할 수 있게 된다
    • COMMIT과 비슷한 형태이므로 예문은 적지 않겠습니다
    • 롤백 이후의 데이터 상태
      • 데이터에 대한 변경사항이 취소된다
      • 이전 데이터는 다시 재저장된다
      • 관련된 행에대한 락이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다
    • 임의적으로 ROLLBACK을 수행하려면 다음과 같이 명시적으로 트랜잭션을 선언하면된다
    BEGIN TRAN
    INSERT INTO PLAYER
    VALUES ('3','이운재','GK',182,82)
    ROLLBACK;
  • 커밋과 롤백의 효과
    • 데이터 무결성 보장
    • 영구적인 변경 하기 전에 데이터 변경사항 확인 가능
    • 논리적으로 연관된 작업을 그룹핑하여 처리 가능
  • mysql에서는 방식이 조금 다르다
START TRANSACTION;
INSERT INTO PLAYER
VALUES ('5','이운재','GK',182,82);
COMMIT;
아니면
ROLLBACK;
  1. SAVEPOINT

    • 롤백할때 트랜잭션에 포함된 전체 작업을 롤백하지 말고 일부만 롤백해야될 때가 있다
    • 이럴 때는 세이브포인트를 정의해서 일부만 롤백할 수 있다
    • 복잡한 대규모 트랜잭션에서 에러가 발생했을 때, 세이브포인트까지의 트랜잭션만 롤백하고 실패한 부분에 대해서만 다시 실행할 수 있다
    • 복수의 세이브포인트를 정의할 수 있다
    • 동일한 세이브포인트 이름일 경우 가장 나중에 정의한 세이브포인트가 유효하다
    # 오라클
    SAVEPOINT SVPT1; 저장점이 생성되었다.
    INSERT INTO PLAYER
    (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1);
    1개의 행이 만들어졌다.
    ROLLBACK TO SVPT1; 롤백이 완료되었다.
    
    # sql 서버
    SAVE TRAN SVTR1; 저장점이 생성되었다.
    INSERT INTO PLAYER
    (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO) VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1);
    1개의 행이 만들어졌다.
    ROLLBACK TRAN SVTR1; 롤백이 완료되었다.
    • 세이브포인트는 미래 방향으로 되돌릴 수는 없다
      • 특정 지점까지 롤백하면 이후의 세이브포인트는 무효가 되기 때문이다
      • 이후의 정의한 세이브포인트는 롤백이 되면 존재하지 않는다
  • 애플리케이션의 이상 종료로 데이터베이스와의 접속이 단절되었을 경우, 트랜잭션은 자동으로 ROLLBACK 된다
profile
개발 공부중

0개의 댓글