SQLD 를 위한 SQL기본문법 정리 7 - TCL(Transaction Control Language)
<트랜잭션>
- 데이터 베이스의 논리적 연산 단위
: 의미적으로 분할할 수 없는 최소의 단위, 하나의 트랜잭션은 여러 SQL문장을 포함
: 성공시 모든 연산을 반영, 취소시 모든 연산을 취소 ▶ ALL OR NOTHING
EX) 도서주문(재고 수량 감소, 주문 내역 생성, 결제, 포인트 적립)
계좌 이체 ( 원계좌의잔액감소, 다른 계좌의 잔액 증가)
교통카드 충전 (잔액증가, 결제)
<트랜잭션의 특성 ACID 특성> - 중요!
1) 원자성 Atomicity : 트랜잭션에서 정의된 연산들은 모두 성공적이거나 실행되지 않아야함. (All or Nothing)
2) 일관성 Consistency : 트랜잭션이 실행 되기 전의 DB 내용이 잘못되어있지 않다면, 실행된 이후에도 DB의 내용에 잘못이 있으면 안됨
3) 고립성 Isolation : 실행되는 도중에 다른 트랜잭션의 영향을 받으면 안됨
4) 지속성 Durability : 성공적으로 수행되면 그 트랜잭션이 갱신한 DB 내용은 (다른트랜잭션이 변경하지않는한) 영구적으로 저장됨
>> 이걸 보장하기 위해 DBMS는 동시성 제어(Concurrency Control) 수행 함
: Lock 기반, Timestamp 기반
<TCL>
* COMMIT 실행 전에는
update player set height = height +10;
- 변경된 내용은 메모리에 임시 저장
- 현재 사용자는 증가한 HEIGHT 값을 읽을 수 있고
- 다른 사용자는 증가 전 HEIGHT 값만 읽을 수 있음
- HEIGHT 에는 잠금(Locking)이 설정되어 다른 사용자는 값을 변경할 수 없음
* COMMIT이 실행된 후에는
- 변경된 내용은 DB에 저장되고
- 변경된 내용을 모든 다른 사용자가 볼 수 있고
- 이전 데이터는 모두 사라짐 ( 별도 로그 보관시 복구 가능)
- 관련된 행에 대한 잠금이 해제되어 모든 사용자가 변경할 수 있음.
<트랜잭션을 제어하기 위한 명령어>
1) COMMIT : 변경된 내용을 DB에 영구적으로 반영
2) ROLLBACK : 기본 - 변경된 내용을 버리고 변경 전 상태(마지막COMMIT)로 복귀
SAVEPOINT(부분 복귀를 위해 지정한 저장점) 를 지정한 경우,지정한 저장점
- 트랜잭션은 SQL문 실행시 자동 시작, COMMIT/ROLLBACK 실행시 종료
- 자동커밋/자동롤백
: DDL문장 수행시 DDL 수행 전에 자동으로 커밋 (auto commit)
: DB를 정상적으로 접속 종료하면 자동 커밋
: 애플리케이션의 이상 종료로 DB와의 접속이 단절되었을 때 자동 rollback
<ROLLBACK>
: 변경한 내용이 모두 취소됨
: 이전 데이터가 다시 재저장됨
: 관련된 행에 대한 잠금이 해제되어 모든 사용자가 변경할 수 있음.
SELECT * FROM PLAYER;
COMMIT;
DELETE FROM PLAYER;
SELECT * FROM PLAYER;
ROLLBACK;
DELETE 하고 나서 보면 아무런 데이터가 없음. (WHERE문 없이 다 삭제 했으니까)
하지만 ROLLBACK하고나서 다시 전체 SELECT문을 하고 나면
다시 전체가 다 돌아와있음. 롤백했으니까!
▲ ROLLBACK 시 갈 수 있는 포인트는 3군데.
<SAVEPOINT>
- 미리 지정한 SAVEPOINT까지만 ROLLBACK
: 특정 저장점까지 롤백하면 그 이후의 명령과 저장점은 모두 무효가 됨
- 일부 TOOL에서는 지원안함
- 동일 이름으로 여러 저장점 정의시 나중에 정의한 저장점이 유효