[SQL] TCL의 모든 것

TCL은 Transaction Control Language의 약자이다. 트랜잭션을 제어하는 명령어로 COMMIT, ROLLBACK, SAVEPOINT가 있다. 일부에서는 TCL을 DCL로 분류하기도 한다. *트랜잭션이란 쪼개질 수 없는 업무처리의 단위이다.
Hi's avatar
Aug 26, 2024
[SQL] TCL의 모든 것

💡
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을 하면 변경하기 이전 값으로 복구된다.
 
ROLLBACKCOMMIT과 마찬가지로, UPDATE 후 오랫동안 ROLLBACK하지 않으면 LOCK에 걸리게 된다.
 

✅ 4. SAVEPOINT

💡
ROLLBACK을 수행할 때 전체 작업을 되돌리지 않고 일부만 되돌릴 수 있도록 하는 명령어이다. ROLLBACK 뒤에 특정 SAVEPOINT를 지정해주면 그 지점까지만 데이터가 복구된다.
notion image
 
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 );
 
위 코드에서 첫 번째 ROLLBACKtoy_id9인 행만 제거한다. 마지막 롤백은 toy_id8인 행도 제거한다.
 
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를 생성하고, 두 번째 SAVEPOINTROLLBACK하면, 두 번째 SAVEPOINT 이후에 생성된 SAVEPOINT는 모두 삭제된다.
따라서, 세 번째로 생성했던 SAVEPOINTROLLBACK할 수 없다.
 
Share article
RSSPowered by inblog