[SQL] TCL (Transaction Control Language)
아래의 명령어들은 모두
Oracle의 SQL 명령어이다. (SQL Server 명령어의 경우 따로 표시)
👑 트랜잭션이란
트랜잭션이란 한 번에 모두 수행되거나 수행되지 않아야 하는 작업 수행의 논리적 단위이다.
하나의 트랜잭션 안의 데이터베이스 조작은 전부 적용하거나 전부 취소해야 한다.
즉, ALL OR NOTHING 의 개념이라고 볼 수 있다.
은행 데이터베이스를 예로 들면, 다음과 같은 계좌 이체 상황을 생각해 볼 수 있다.
계좌 이체 과정
1. 1번 계좌에서 1000원을 뺀다.
2. 2번 계좌에 1000원을 더한다.
계좌이체라는 작업은 위의 두 과정이 모두 성공적으로 완료되어야만 하는 작업이다.
만약 1번을 수행한 후 2번이 정상적으로 수행되지 않고 종료되는 상황은 발생해서는 안되는 상황이다.
따라서 위의 두 과정은 atomic 하게 수행되어야 하며, 위의 계좌이체 과정처럼 한 번에
모두 수행되거나 수행되지 않아야 하는 논리적 작업 단위를 트랜잭션 (Transaction) 이라고 한다.
정상적으로 반영된 데이터를 DB에 반영시키는 것을 COMMIT, 트랜잭션 시작 이전의 상태로 되돌리는
것을 ROLLBACK 이라 하며, SAVEPOINT 기능과 묶어 3가지 명령어를 TCL 로 분류한다.
💡 트랜잭션의 특성
-
원자성 (Atomicity)
트랜잭션 변경 연산은 모두 성공적으로 수행되거나 전혀 수행되지 않아야 한다.
-
일관성 (Consistency)
트랜잭션 실행 전의 DB가 정상이라면, 트랜잭션 실행 후에도 일관성을 유지해야 한다.
-
고립성 (Isolation)
각각의 트랜잭션은 단독으로 실행된 것 같은 효과를 가져야 한다.
-
지속성 (Durability)
트랜잭션이 성공적으로 완료되면 데이터베이스에 대한 변경도 영구적이어야 한다.
👑 COMMIT
-
데이터의 입력/수정/삭제 후 문제가 없다고 판단될 경우
COMMIT을 통해 트랜잭션을 완료한다. -
COMMIT이전에는 단지 메모리 버퍼에만 영향을 주기 때문에 이전 상태로의 복구가 가능하다. -
COMMIT이후에는 변경 사항이 DB에 반영되고, 이전 데이터는 사라진다. -
COMMIT이전에 변경된 행은 잠금이 되어 다른 사용자가 변경할 수 없는 상태이며,
COMMIT이후에 잠금이 풀리고, 다른 사용자가 행을 조작할 수 있는 상태가 된다. -
즉,
INSERT,UPDATE등의 문장을 사용한 후 변경 작업이 완료되었음을 알리는 역할을 한다. -
Oracle의 경우DML수행 후 사용자가COMMIT혹은ROLLBACK을 수행해 주어야 한다.
(일부 툴에서AUTO COMMIT옵션 사용 가능) -
SQL Server의 경우 기본적으로AUTO COMMIT모드이다.
-- e.g.
DELETE TEAM;
COMMIT;
-- e.g.
UPDATE TEAM
SET TEAM_ID = 'T01';
COMMIT;
👑 ROLLBACK
-
데이터를 입력/수정/삭제 한 경우
COMMIT이전에 변경 사항을 취소할 때ROLLBACK을 사용한다. -
이전 상태로 복구되며, 관련 튜플에 대한 잠금이 풀리고 다른 사용자의 데이터 변경이 가능해진다.
DELETE FROM TEAM;
ROLLBACK;
-
COMMIT과ROLLBACK을 통해 다음의 효과를 볼 수 있다.-
데이터 무결성 보장
-
데이터의 영구적인 변경 전, 데이터의 변경 사항을 확인할 수 있다.
-
논리적으로 연관된 작업을 그룹화하여 처리할 수 있다.
-
👑 SAVEPOINT
-
SAVEPOINT를 정의하면 롤백시에 전체 작업을 롤백하는 것이 아닌 저장점까지만 롤백이 가능하다. -
복수의
SAVEPOINT를 정의할 수 있으며, 동일이름의 저장점을 정의하면 나중에 정의한 것이 유효하다.
-- Oracle
SAVEPOINT SVPT1;
ROLLBACK TO SVPT1;
-- SQL Server
SAVE TRANSACTION SVTR1;
ROLLBACK TRANSACTION SVTR1;
-
롤백 시에 미래 방향으로 되돌릴 수는 없다.
-
SAVEPOINT A를 지정한 후SAVEPOINT B를 지정했다고 하자. -
만약
A로 돌아가면B는 무효가 되기 때문이다.
-
👑 정리
-
테이블을 변경하는 명령 수행시에 변경되는 데이터의 무결성을 보장하기 위해 커밋과 롤백을 수행한다.
-
COMMIT: 변경된 데이터를 영구적으로 반영하라는 의미 -
ROLLBACK: 변경된 데이터에 문제가 있으니 변경 전으로 복귀하라는 의미 -
SAVEPOINT: 사전에 지정한SAVEPOINT까지만 롤백하라는 의미 -
Oracle의 경우DDL문장 실행 시 그 전후 시점에 자동으로 커밋을 한다.-
DB를 정상적으로 종료 시 자동으로 트랜잭션이 커밋된다.
-
DB와의 접속이 비정상적으로 종료되었을 경우 트랜잭션이 자동으로 롤백된다.
-
Leave a comment