TCL

HELLO_DINO·2022년 11월 8일
0

트랜잭션 개요

SELECT * FROM DEPT;

트랜잭션은 데이터베이스의 논리적 연산단위다. 하나의 트랜잭션에는 하나 이상의 SQL 문장이 포함된다. 트랜잭션은 분할 할 수 없는 최소의 단위다. 이는 전부 적용하거나 전부 취소한다.

올바르게 반영된 데이터를 데이터베이스에 반영시키는 커밋 명령어, 데이터를 트랜잭션 시작 이전의 상태로 되돌리는 롤백 명령어, 트랜잭션의 일부만 취소할 수 있게 만드는 저장점(SAVEPOINT) 명령어까지, 이 3가지 명령어를 트랜잭션을 제어하는 TCL로 분류한다.

트랜잭션의 대상이 되는 SQL문은 INSERT, UPDATE, DELETE 등 데이터를 변경하는 DML문이다. SELECT는 직접적인 트랜잭션의 대상이 아니지만, SELECT FOR UPDATE 등 배타적 LOCK을 요구하는 SELECT 문장은 트랜잭션의 대상이 될 수 있다.

트랜잭션의 특성은 아래와 같다.

원자성 : 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않는 상태로 남아 있어야 한다.
일관성 : 트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못 돼 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안된다.
고립성 : 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.
지속성 : 트랜잭션이 성공적으로 수행되면, 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다.

COMMIT

입력, 수정, 삭제한 데이터에 대해 전혀 문제가 없다고 판단됐을 경우 COMMIT 명령어로 트랙잭션을 완료할 수 있다. COMMIT이나 ROLLBACK 이전의 데이터 상태는 다음과 같다.

  • 데이터의 변경을 취소해 이전 상태로 복구 가능하다.
  • 현재 사용자는 SELECT 문장으로 결과를 확인 가능하다.
  • 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없다.
  • 변경된 행은 잠금이 설정돼서 다른 사용자가 변경할 수 없다.
INSERT INTO DEPT(DEPTNO, DNAME, LOC)
	VALUES('50', 'HI', 'LOC');
    
COMMIT;

변경 작업이 완료됐음을 데이터베이스에 알려주기 위해 사용한다.
COMMIT 이후의 데이터 상태는 다음과 같다.

  • 데이터에 대한 변경 사항이 데이터베이스에 반영된다.
  • 이전 데이터는 영원히 잃어버리게 된다.
  • 모든 사용자는 결과를 볼 수 있다.
  • 관련된 행에 대한 잠금이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다.

트랜잭션은 기본적으로 3가지 방식을 가진다.
1) 암시적 트랜잭션
Oracle의 방식이다. 트랜잭션의 시작은 DBMS가 처리하고 트랜잭션의 끝은 사용자가 명시적으로 COMMIT 또는 ROLLBACK으로 처리한다. 인스턴스 단위 또는 세션 단위로 설정할 수 있다. 인스턴스 단위로 설정하려면 서버 속성 창의 연결화면에서 기본연결 옵션 중 암시적 트랜잭션에 체크해 주면 된다. 세면 단위로 설정하기 위해서는 세션 옵션 중 SET IMPLICIT TRANSACTION ON을 사용하면 된다.

2) 명시적 트랜잭션
트랜잭션의 시작과 끝을 모두 사용자가 명시적으로 지성하는 방식이다. BEGIN TRANSACTION(BIGIN TRAN 구문도 가능)으로 트랜잭션을 시작하고, COMMIT TRANSACTION(TRANSACTION은 생략 가능) 또는 ROLLBACK TRANSACTION(TRANSACTION은 생략 가능)으로 트랜잭션을 종료한다. ROLLBACK 구문을 만나면 최초의 BEGIN TRANSACTION 시점까지 모두 ROLLBACK이 수행된다.

3) AUTO COMMIT
SQL Server의 기본 방식이며, DML과 DDL을 수행할 때마다 DBMS가 트랜잭션을 컨트롤하는 방식이다. 명령어가 성공적으로 수행되면 자동으로 COMMIT을 수행하고, 오류가 발생하면 자동으로 ROLLBACK을 수행한다.

ROLLBACK

테이블 내 입력한 데이터나 수정한 데이터, 삭제한 데이터에 대해 COMMIT 이전에는 변경 사항을 취소할 수 있다. 데이터베이스는 롤백 기능을 사용한다. 롤백은 데이터 변경 사항이 취소돼 데이터가 이전 상태로 복구되며, 관련된 행에 대한 잠금이 풀리고 다른 사용자들이 데이터 변경을 할 수 있게 된다.

UPDATE DEPT SET DNAME = 'HEY'
    WHERE DEPTNO = 50;

ROLLBACK;

ROLLBACK 후의 데이터 상태는 다음과 같다.

  • 데이터에 대한 변경 사항은 취소된다.
  • 데이터가 트랜잭션 시작 이전의 상태로 되돌려진다.
  • 관련된 행에 대한 잠금이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다.

COMMIT과 ROLLBACK을 사용함으로써 다음과 같은 효과를 볼 수 있다.

  • 데이터 무결성 보장
  • 영구적인 변경을 하기 전에 데이터의 변경 사항 확인 가능
  • 논리적으로 연관된 작업을 그룹핑해 처리 가능

SAVEPOINT

저장점을 정의하면 롤백할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라, 현 시점에서 저장점까지 트랜잭션의 일부만 롤백할 수 있다. 따라서 복잡한 대규모 트랜잭션에서 에러가 발생했을 때 저장점까지의 트랜잭션만 롤백하고 실패한 부분에 대해서만 다시 실행할 수 있다.(일부 툴에서는 지원을 안 할 수 있음).
복수의 저장점을 정의할 수 있으며, 동일이름으로 여러 개의 저장점을 정의했을 때는 마지막에 정의한 저장점만 유효하다. 다음의 SQL 문은 SVPT1이라는 저장점을 정의하고 있다.

SAVEPOINT SVPT1;
ROLLBACK TO SVPT1;

위와 같이 롤백에 저장점 명을 부여해 실행하면, 저장점 설정 이후에 있었던 데이터 변경에 대해서만 원래 데이터 상태로 되돌아가게 된다.

SAVEPOINT SVPT1;

DELETE DEPT
WHERE DEPT = 30;

ROLLBACK TO SVPT1;

저장점을 A로 되돌리고 나서 다시 B로 되돌릴 수는 없다.
A 이후에 정의한 저장점 B가 존재하지 않는다.

0개의 댓글