[SQL] TCL의 모든 것
TCL은 Transaction Control Language의 약자이다. 트랜잭션을 제어하는 명령어로 COMMIT, ROLLBACK, SAVEPOINT가 있다. 일부에서는 TCL을 DCL로 분류하기도 한다.
*트랜잭션이란 쪼개질 수 없는 업무처리의 단위이다.
Aug 26, 2024
TCL은 Transaction Control Language의 약자이다. 트랜잭션을 제어하는 명령어로
COMMIT
, ROLLBACK
, SAVEPOINT
가 있다. 일부에서는 TCL을 DCL로 분류하기도 한다.*트랜잭션이란 쪼개질 수 없는 업무처리의 단위이다.
✅ 1. 트랜잭션 특징
원자성
(Atomicity) | 트랜잭션이 묶인 일련의 동작들은 모두 성공하거나 모두 실패해야 한다. 즉, 살아도 같이 살고 죽어도 같이 죽는 관계가 되는 것이다. (All or Nothing) |
일관성
(Consistency) | 트랜잭션이 완료된 이후에도 데이터베이스가 가진 데이터에 일관성이 있어야 한다. 예를 들어, 이미 결제된 물건의 수량과 물건 재고의 합은 언제나 처음 보유하고 있던 총 수량과 일치해야 한다. |
고립성
(Isolation) | 하나의 트랜잭션은 고립되어 수행되어야 한다. 만약 내가 구매하고자 하는 물건을 다른 사람이 먼저 구매하고 있다면, 내가 그 물건에 대한 정보를 변경할 수 없고 해당 거래가 끝날 때까지 대기해야 한다. |
지속성
(Durability) | 트랜잭션이 성공적으로 수행되었을 경우 트랜잭션이 변경한 데이터가 영구적으로 저장되어야 함을 의미한다. 쉽게 말해 모든 트랜잭션이 로그에 남겨진 뒤 COMMIT 되어야 하고, 시스템 장애가 발생되더라도 복구가 가능해야 한다. |
✅ 2. COMMIT
INSERT
, DELETE
, UPDATE
이후 변경된 내용을 확정하고 DB에 반영하는 명령어이다. COMMIT
을 실행하지 않으면 메모리까지만 반영되는데, 메모리는 휘발성이기 때문에 전원을 껐다 키거나 용량이 가득차면 사라질 수 있다. 따라서, COMMIT을 실행해서 최종적으로 DB에 반영해야 하며, 이때 트랜잭션이 종료된다.
만약,
UPDATE
를 하고 오랫동안 COMMIT
을 하지 않은 상태로 두면 해당 데이터는 LOCK
에 걸리게 되어 다른 사용자가 변경할 수 없게 되니 주의하자 !! ✅ 3. ROLLBACK
INSERT, DELETE, UPDATE 이후 변경된 내용을 취소하는 명령어이다. ROLLBACK을 하면 변경하기 이전 값으로 복구된다.
ROLLBACK
도 COMMIT
과 마찬가지로, UPDATE
후 오랫동안 ROLLBACK
하지 않으면 LOCK
에 걸리게 된다.✅ 4. SAVEPOINT
ROLLBACK
을 수행할 때 전체 작업을 되돌리지 않고 일부만 되돌릴 수 있도록 하는 명령어이다. ROLLBACK
뒤에 특정 SAVEPOINT
를 지정해주면 그 지점까지만 데이터가 복구된다.insert into toys ( toy_id, toy_name, colour ) values ( 8, 'Pink Rabbit', 'pink' ); exec savepoint after_six; insert into toys ( toy_id, toy_name, colour ) values ( 9, 'Purple Ninja', 'purple' ); select * from toys where toy_id in ( 8, 9 ); rollback to savepoint after_six; select * from toys where toy_id in ( 8, 9 ); rollback; select * from toys where toy_id in ( 8, 9 );
위 코드에서 첫 번째
ROLLBACK
은 toy_id
가 9
인 행만 제거한다. 마지막 롤백은 toy_id
가 8
인 행도 제거한다.exec savepoint first_sp; exec savepoint second_sp; exec savepoint third_sp; rollback to savepoint second_sp; rollback to savepoint third_sp; /* Fails - third_sp no longer exists */ rollback to savepoint first_sp;
만약, 3개의
SAVEPOINT
를 생성하고, 두 번째 SAVEPOINT
로 ROLLBACK
하면, 두 번째 SAVEPOINT
이후에 생성된 SAVEPOINT
는 모두 삭제된다. 따라서, 세 번째로 생성했던
SAVEPOINT
로 ROLLBACK
할 수 없다.Share article