[DATABASE] TCL 이란? COMMIT, ROLLBACK, SAVEPOINT
TCL 이란?
TRANSACTION CONTROL LANGUAGE 로 트랜잭션을 제어하는 언어입니다.
트랜잭션은 데이터베이스의 논리적 연산단위입니다.
하나의 트랜잭션에는 하나 이상의 SQL 문장이 포함되며 분할할 수 없는 최소의 단위입니다. 즉 ALL OR NOTHING 입니다.
트랜잭션 대상이 되는 SQL 문은 UPDATE, INSERT, DELETE 등 데이터를 수정하는 DML 문 입니다.
SELECT 문장은 직접적인 트랜잭션 대상은 아니지만, SELECT FOR UPDATE 등 배타적 LOCK 을 요구하는 문장은 트랜잭션 대상이 될 수 있습니다.
트랜잭션의 특성
특성 |
설명 |
원자성 (Atomicity) |
트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않은 상태로 남아있어야 한다. ( All Or Nothing ) |
일관성 (Consistency) |
트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못 되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안 된다. |
고립성 (Isolation) |
트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다. |
지속성 (Durability) |
트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이커베이스의 내용은 영구적으로 저장된다. |
COMMIT
입력한 자료나 수정한 자료에 대해서 또는 삭제한 자료에 대해서 전혀 문제가 없다고 판단되었을 경우 COMMIT 명령어를 통해서 트랜잭션을 완료합니다.
COMMIT;
COMMIT 이나 ROLLBACK 이전의 데이터 상태는 다음과 같습니다.
1. 메모리 버퍼에만 영향을 받았기 때문에 데이터의 변경 이전 상태로 복구가 가능합니다.
2. 현재 사용자는 SELECT 문장으로 결과를 확인 가능합니다.
3. 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없습니다.
4. 변경된 행은 잠금이 설정되어서 다른 사용자가 변경할 수 없습니다.
COMMIT 이후의 상태는 다음과 같습니다.
1. 데이터에 대한 변경 사항이 데이터베이스에 반영됩니다.
2. 이전 데이터는 영원히 잃어버리게 됩니다.
3. 모든 사용자는 결과를 볼 수 있습니다.
4. 관련된 행에 대한 잠금이 풀리고, 다른 사용자들이 행을 조작할 수 있습니다.
ORACLE, GOLDILOCKS 은 DML 을 실행하는 경우 DBMS 가 트랜잭션을 내부적으로 실행하며 사용자가 임의로 COMMIT 혹은 ROLLBACK 을 수행해 주어야 트랜잭션이 종료됩니다.
하지만 MS-SQL 은 기본적으로 DML 에 대해서도 AUTO COMMIT 모드이기 때문에 성공하면 자동으로 COMMIT, 실패하면 ROLLBACK 처리됩니다.
ROLLBACK
COMMIT 이전에는 변경 사항을 취소 할 수 있는데 데이터베이스에서 ROLLBACK 기능을 사용합니다.
ROLLBACK 은 데이터 변경 사항이 취소되어 데이터의 이전 상태로 복구되며, 관련된 행에 대한 잠금이 풀리고 다른 사용자들이 데이터를 변경 할 수 있습니다.
ROLLBACK;
ROLLBACK 이후의 상태는 다음과 같습니다.
1. 데이터에 대한 변경 사항은 취소됩니다.
2. 이전 데이터는 다시 재저장됩니다.
3. 관련된 행에 대한 잠금이 풀리고, 다른 사용자들이 행을 조작할 수 있게 됩니다.
SAVEPOINT
저장점을 정의하면 롤백할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서 SAVEPOINT 까지 트랜잭션의 일부만 롤백할 수 있습니다.
복수의 저장점을 정의할 수 있으며, 동일이름으로 저장점을 정의했을 때는 나중에 정의한 저장점이 유요합니다.
ORACLE 의 경우 아래와 같이 수행합니다.
SAVEPOINT 포인트명1; SAVEPOINT 포인트명2; ROLLBACK TO 포인트명1;
GOLDILOCKS 의 경우 아래와 같이 수행합니다.
SAVEPOINT 포인트명1; SAVEPOINT 포인트명2; ROLLBACK TO SAVEPOINT 포인트명1;
MS-SQL 의 경우 아래와 같이 수행합니다.
SAVEPOINT TRANSACTION 포인트명1; SAVEPOINT TRANSACTION 포인트명2; ROLLBACK TRANSACTION 포인트명1;
특정 저장점까지 ROLLBACK 하면 그 저장점 이후에 설정한 저장점이 무효가 되기 때문에 위에서의 경우 포인트명1 로 ROLLBACK 한 경우 포인트명2 로 되돌릴 수 없습니다.
저장점 지정 없이 ROLLBACK 을 실행했을 경우 모든 변경사항을 취소합니다.
좀더 깊게 생각하면 아래와 같습니다.
1. DML 문장 이후에 커밋 없이 DDL 문장이 실행되면 DDL 수행 전에 자동으로 COMMIT 됩니다.
2. 데이터베이스를 정상적으로 접속을 종료하면 자동으로 트랜잭션이 COMMIT 됩니다.
3. 애플리케이션의 이상 종료로 데이터베이스와의 접속이 단절되었을 때는 트랜잭션이 자동으로 ROLLBACK 됩니다.
이 내용은 'SQL 전문가 가이드, 한국데이터베이스 진흥원' 에서 공부한 내용입니다.