데이터베이스/SQL

SQLD 를 위한 SQL기본문법 정리 7 - TCL(Transaction Control Language)

ADELA_J 2024. 2. 15. 20:04

<트랜잭션>

- 데이터 베이스의 논리적 연산 단위

 : 의미적으로 분할할 수 없는 최소의 단위, 하나의 트랜잭션은 여러 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문을 하고 나면

다시 전체가 다 돌아와있음. 롤백했으니까!

 

출처 : https://velog.io/@jo_dbsgh95/SQL-트랜잭션의-특성Commit-Rollback-Savepoint

▲ ROLLBACK 시 갈 수 있는 포인트는 3군데.

 

<SAVEPOINT>

- 미리 지정한 SAVEPOINT까지만 ROLLBACK

 : 특정 저장점까지 롤백하면 그 이후의 명령과 저장점은 모두 무효가 됨

- 일부 TOOL에서는 지원안함

- 동일 이름으로 여러 저장점 정의시 나중에 정의한 저장점이 유효