TCL (트랜잭션 제어어 : Transaction Control Language)
1. COMMIT
1️⃣ 트랜잭션의 기초 개념
1) 트랜잭션
- 데이터베이스 내에서 실행되는 하나의 논리적인 작업 단위
- 여러 개의 연산을 포함할 수 있음
- 데이터베이스의 응용프로그램들은 수많은 트랜잭션의 집합체
2) 트랜잭션 명령어
- COMMIT 명령어
- 데이터를 데이터베이스에 저장
- ROLLBACK 명령어
- 데이터의 상태를 이전으로 되돌림
- SAVEPOINT 명령어
- 트랜잭션의 일부만 취소
3) 트랜잭션 ACID 속성
- 원자성(Atomicity)
- 데이터베이스의 일관성을 유지하는 핵심 메커니즘
- 모든 연산이 성공적으로 완료되거나 아무것도 실행되지 않은 상태 유지
- 일관성(Consistency)
- 트랜잭션은 데이터베이스의 일관성을 유지해야 함
- 고립성(Isolation)
- 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행되어야 함
- 지속성(Durability)
- 성공적으로 수행된 트랜잭션의 결과는 시스템 오류가 발생해도 유지해야 함
2️⃣ COMMIT
1) COMMIT
- COMMIT을 실행 → 트랜잭션 종료 / 해당 트랜잭션에서 이루어진 모든 변경 사항이 데이터베이스에 영구적으로 저장됨
- 다른 트랜잭션이나 사용자는 COMMIT이 완료된 데이터만 볼 수 있음
- COMMIT 이후에는 해당 트랜잭션에 대한 ROLLBACK 불가능
- COMMIT 이후 데이터 복구가 매우 어렵지만, 몇 가지 방법을 통해 일부 복구 작업 가능
2) 오토커밋(Auto-commit)
- 일부 데이터베이스 시스템에서는 SQL 문이 실행될 때마다 자동으로 COMMIT을 수행하는 자동 커밋 모드 사용 가능
- 오토커밋 활성화된 경우, 각 SQL 문이 실행될 때마다 트랜잭션 자동 종료
3) COMMIT 예
// 1. EMP_MNG 테이블의 YONGMOON, YONGMMON2 삭제
DELETE FROM EMP
WHERE ENAME = 'YONGMOON' OR ENAME = 'YONGMOON2';
// 2. 새로운 직원을 EMP 테이블에 추가
INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES (7935, 'JAMESBOND', 'ANALYST', 7566, TO_DATE('2023-08-19', 'YYYY-MM-DD'), 3500, NULL, 20);
// 3. 특정 직원의 급여를 10% 인상 (EMPNO가 7935인 'JAMESBOND')
UPDATE EMP
SET SAL = SAL * 1.1
WHERE EMPNO = 7935;
// 4. 특정 직원의 부서 번호를 30번으로 변경 (EMPNO가 7902인 FORD)
UPDATE EMP
SET DEPTNO = 30
WHERE EMPNO = 7902;
// 5. 모든 변경 사항을 확정
COMMIT;2. ROLLBACK
1️⃣ ROLLBACK의 기초 개념
1) ROLLBACK
- 데이터베이스 트랜잭션에서 이루어진 모든 변경 사항을 취소하고, 트랜잭션이 시작된 시점으로 되돌리는 명령어
- 트랜잭션 중간에 사용될 수 있으며, COMMIT 이전의 모든 작업 되돌림
- 특정 지점까지 되돌릴 수 있음
- SAVEPOINT 설정하고, ROLLBACK TO SAVEPOINT 사용하여 트랜잭션 일부분만 취소 가능
2) ROLLBACK 예
// 1. 특정 직원의 급여를 40% 인상 (EMPNO가 7935인 'JAMESBOND')
UPDATE EMP
SET SAL = SAL * 1.4
WHERE EMPNO = 7935;
// 2. 특정 직원의 부서 번호를 30번으로 변경 (EMPNO가 7935인 'JAMESBOND')
UPDATE EMP
SET DEPTNO = 30
WHERE EMPNO = 7935;
// 3. 모든 변경 사항을 취소
ROLLBACK;3. SAVEPOINT
1️⃣ SAVEPOINT의 기초 개념
1) SAVEPOINT
- 트랜잭션 내에서 트정 지점을 설정하여 그 지점까지의 작업을 안전하게 저장해두고, 이후에 문제가 발생하면 해당 지점으로 롤백할 수 있도록 하는 기능
- 트랜잭션을 여러 단계로 나누어 관리할 수 있어, 필요한 경우 트랜잭션 전체를 취소하지 않고 특정 시점 이후의 작업만 취소할 수 있음
- ROLLBACK TO savepoint_name 구문
- 지정된 SAVEPOINT 이후에 수행된 모든 작업을 취소
- SQVEPOINT 이전의 작업은 취소되지 않고 그대로 유지
- 트랜잭션 내에서 여러 개의 SAVEPOINT 설정 가능
- COMMIT 실행하면 트랜잭션 내의 모든 작업이 확정되며, 모든 SAVEPOINT는 삭제됨
- ROLLBACK 실행하면 트랜잭션 전체 취소되며, 모든 SAVEPOINT는 삭제됨
2) SAVEPOINT 예
// 트랜잭션 시작
BEGIN;
// 1. 첫 번째 INSERT
INSERT INTO EMP (EMPNO, ENAME, JOB, SAL, DEPTNO)
VALUES (8001, 'AAAAA', 'CLERK', 1500, 10);
// 2. 첫 번째 SAVEPOINT 설정
SAVEPOINT sp1;
// 3. 두 번째 INSERT
INSERT INTO EMP (EMPNO, ENAME, JOB, SAL, DEPTNO)
VALUES (8002, 'BBBBB', 'MANAGER', 2500, 20);
// 4. 두 번째 SAVEPOINT 설정
SAVEPOINT sp2;
// 5. 세 번째 INSERT
INSERT INTO EMP (EMPNO, ENAME, JOB, SAL, DEPTNO)
VALUES (8003, 'CCCCC', 'ANALYST', 3000, 30);
// 6. 오류 발생으로 인해 두 번째 SAVEPOINT로 롤백
ROLLBACK TO sp2;
// 7. COMMIT 실행으로 나머지 트랜잭션 확정
COMMIT;Share article