TCL은 무엇일까?
트랜잭션 제어어 (TCL)
--
TCL은
DB에서 트랜잭션을 제어하는 데 사용되는 SQL 명령어다.
이때 DDL, DML, DCL처럼 직접적으로 데이터를 조작하는 것이 아니라
트랜잭션 단위에서 데이터 변경을 제어하는 명령어이므로
TCL은 DDL, DML, DCML 명령어와 함께 사용된다.
트랜잭션(Transaction)은
여러 SQL 작업을 하나의 단위로 묶어 실행하는 것을 의미한다.
트랜잭션의 주요 특성 4가지 (ACID)
- Atomicity (원자성) : 모든 작성이 성공적이거나 전혀 실행되지 않은 것처럼 취급
- Consistency (일관성) : DB의 상태를 일관성 있게 유지
- Isolation (격리성) : 독립적으로 실행되어 다른 트랜잭션에 영향을 주지 않음
- Durability (지속성) : 성공적으로 완료되면, 해당 결과는 영구적으로 저장됨
즉, 트랜잭션이 모두 성공적으로 완료되거나 실패 시 이전 상태로 롤백할 수 있도록 관리하는 것이 TCL이다.
대표적인 TCL 명령어
- BEGIN : 트랜잭션을 시작
- COMMIT : 트랜잭션에서 수행된 모든 변경사항을 저장(확정)
- ROLLBACK : 트랜잭션에서 수행된 변경사항을 취소하고, DB를 이전 상태로 되돌린다.
- SAVEPOINT : 트랜잭션 내에서 특정 지점을 지정 (해당 지점 이후로만 롤백 가능)
- SET TRANSACTION : 트랜잭션의 특성을 설정
--
COMMIT 명령어
--
COMMIT은
트랜잭션에서 발생한 모든 변경사항을 영구적으로 저장하는 명령어다.
COMMIT 기본 형식
COMMIT;
COMMIT 예시 코드
BEGIN;
INSERT INTO Members (id, name, age) VALUES (1, 'John Doe', 30);
UPDATE Members SET age = 35
WHERE id = 1;
COMMIT;
BEGIN으로 트랜잭션 시작을 알리고
INSERT, UPDATE문이 모두 성공적으로 완료된 후
COMMIT 명령어로 트랜잭션을 확정 후 DB에 반영(저장)한다.
--
ROLLBACK 명령어
--
ROLLBACK은
트랜잭션이 실패하거나 오류가 발생했을 때,
해당 트랜잭션 시작 이후의 모든 변경사항을 취소하고
트랜잭션 시작 전의 상태로 되돌리는 명령어다.
ROLLBACK 기본 형식
ROLLBACK;
ROLLBACK 예시 코드
BEGIN;
INSERT INTO Members (id, name, age) VALUES (1, 'John Doe', 30);
UPDATE Members SET age = 35
WHERE id = 1;
ROLLBACK;
BEGIN으로 트랜잭션 시작을 알리고
INSERT, UPDATE가 수행되지만,
모두 수행된 뒤에 ROLLBACK을 만나서 다시 모든 변경사항을 BEGIN을 하기 전으로 되돌린다.
--
SAVEPOINT 명령어
--
SAVEPOINT는
트랜잭션 내에서 특정 지점을 설정하는 명령어로
ROLLBACK할 때 해당 트랜잭션 전체를 롤백하지 않고 SAVEPOINT 이후의 작업만 롤백하도록 한다.
SAVEPOINT 기본 형식
SAVEPOINT 세이브포인트 이름;
ROLLBACK TO 세이브포인트 이름;
// 그냥 ROLLBACK; 은 트랜잭션 시작 전의 상태로 되돌리고
// ROLLBACK TO 세이프포인트 이름; 은 해당 세이프 포인트까지만 되돌린다.
// 바로 이전의 세이브 포인트가 아닌 한참 전의 세이브 포인트 이름을 작성하면 거기로 되돌아간다.
SAVEPOINT 예시 코드
BEGIN;
INSERT INTO employees (id, name, salary) VALUES (3, 'Alice', 70000);
SAVEPOINT sp1;
UPDATE employees SET salary = 75000 WHERE id = 3;
SAVEPOINT sp2;
DELETE FROM employees WHERE id = 3;
ROLLBACK TO sp2;
COMMIT;
ROLLBACK TO sp2를 만나
sp2 세이프포인트까지만 되돌린다.
--
SET TRANSACTION 명령어
--
SET TRANSACTION은
트랜잭션의 특성을 설정하는 명령어로
주로 "격리 수준(Isolation Level)"을 설정하는 데 사용된다.
격리 수준(Isolation Level)은
여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않도록 제어하는 방법을 정의한다.
SET TRANSACTION 기본 형식
SET TRANSACTION <트랜잭션의 특성> <설정값>
// 격리 수준 설정 예시 코드
SET TRANSACTION ISOLATION LEVEL <level>;
격리 수준의 level 값 종류
- READ UNCOMMITTED : 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽을 수 있음
- READ COMMITTED : 커밋된 데이터만 읽을 수 있음
- REPEATABLE READ : 트랜잭션 중 읽은 데이터는 다른 트랜잭션이 수정 불가능
- SERIALIZABLE : 가장 엄격한 격리 수준으로, 트랜잭션 간 완전히 독립적으로 실행
SET TRANSACTION 예시 코드
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
UPDATE employees SET salary = 80000 WHERE id = 4;
COMMIT;
해당 트랜잭션은 격리 수준이 SERIALIZABLE 수준에서 실행되어
다른 트랜잭션과는 완전히 독립적으로 동작한다.
--
'SQL [DB]' 카테고리의 다른 글
[SQL문] 서브쿼리 (SQL문 내부에 또 다른 SQL문) (0) | 2024.09.15 |
---|---|
[SQL문] 데이터 제어어 (DCL) (0) | 2024.09.13 |
[SQL문] 데이터 조작어 (DML) (0) | 2024.09.12 |
[SQL문] 데이터 정의어 (DDL) (0) | 2024.09.12 |
관계 데이터 모델의 개념 (릴레이션, 무결성, 관계대수) (0) | 2024.09.10 |