TLC
트랜잭션(Transaction)
- 데이터베이스의 논리적 연산 단위로, 의미적으로 분할할 수 없는 최소의 단위
- 일반적으로 하나의 트랜잭션은 여러 SQL 문장을 포함함
- 성공 시 모든 연산을 반영하고, 취소 시 모든 연산을 취소함 (All or Nothing)
트랜잭션의 예
-
도서 주문
- 재고 수량 감소, 주문 내역 생성, 결제, 포인트 적립
-
계좌 이체
- 원 계좌의 잔액 감소, 다른 계좌의 잔액 증가
-
교통카드 충전
트랜잭션의 특성 (ACID 특성)
| 특성 | 설명 |
|---|
| 원자성 (Atomicity) | 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되든지 아니면 전혀 실행되지 않은 상태로 남아 있어야 한다. (All or Nothing) |
| 일관성 (Consistency) | 트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못되지 않았다면, 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있어서는 안 된다. |
| 고립성 (Isolation) | 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아서는 안 된다. |
| 지속성 (Durability) | 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다. |
추가 설명
- 트랜잭션의 ACID 특성을 보장하기 위해 DBMS는 동시성 제어 (Concurrency Control)를 수행
- Lock 기반, Timestamp 기반 등 다양한 동시성 제어 기법이 사용됨
COMMIT 실행 전 상태
UPDATE PLAYER SET HEIGHT = HEIGHT + 10;
- 변경된 내용은 메모리에 임시로 저장됨
- 현재 사용자는 증가한 HEIGHT 값을 읽을 수 있음
- 다른 사용자는 증가 전 HEIGHT 값만 읽을 수 있음
- HEIGHT에는 잠금(Locking)이 설정되어 다른 사용자는 값을 변경할 수 없음
COMMIT 실행 후
COMMIT;
- 변경된 내용은 DB에 영구적으로 저장됨
- 변경 내용을 모든 다른 사용자가 볼 수 있음
- 이전 데이터는 모두 사라짐 (별도의 로그 보관 시 복구 가능)
- 관련된 행에 대한 잠금이 해제되어 모든 사용자가 변경할 수 있음
트랜잭션을 제어하기 위한 명령어
- COMMIT: 변경된 내용을 DB에 영구적으로 반영
- ROLLBACK:
- 기본: 변경된 내용을 버리고 마지막
COMMIT 상태로 복귀
- SAVEPOINT를 지정한 경우, 지정한 저장점까지 부분 복구
- SAVEPOINT: 부분 복귀를 위해 지정한 저장점
트랜잭션 자동 시작 및 종료
- 트랜잭션은 SQL문 실행 시 자동 시작되고,
COMMIT이나 ROLLBACK을 통해 명시적 종료됨.
자동 커밋 / 자동 롤백
- 자동 커밋:
- DDL문장 수행 시, DDL 수행 전에 자동으로 커밋 (auto commit)
- DB를 정상적으로 접속 종료하면 자동 커밋
- 자동 롤백:
- 애플리케이션의 이상 종료로 DB와의 접속이 단절되었을 때 자동 롤백
ROLLBACK
ROLLBACK 이후의 데이터 상태
...
COMMIT;
UPDATE PLAYER SET HEIGHT = HEIGHT + 10;
DELETE FROM PLAYER;
ROLLBACK;
- 변경한 내용이 모두 취소됨
- 이전 데이터가 다시 재저장됨
- 관련된 행에 대한 잠금이 해제되어 모든 사용자가 데이터를 변경할 수 있음
SAVEPOINT와 ROLLBACK
- 트랜잭션 도중 특정 위치에 SAVEPOINT를 설정해 부분 복구 가능
- 예시:
ROLLBACK TO A: SAVEPOINT A 위치로 복구
ROLLBACK TO B: SAVEPOINT B 위치로 복구
- SAVEPOINT를 활용하면 트랜잭션 중간에 특정 작업을 저장하여 부분적으로 작업을 취소하거나 복구할 수 있음
SAVEPOINT
예시
...
SAVEPOINT PT1;
...
SAVEPOINT PT1;
...
SAVEPOINT PT2;
...
ROLLBACK TO PT1;
- (2)번으로 ROLLBACK 수행 시, (2)번 이후의 모든 명령이 무효화됨