javaboiii의 DataBase

DB - TCL(Transaction Control Language)

javaboiii 2024. 8. 13. 09:01

트랜잭션

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

  의미적으로 분할할 수 없는 최소의 단위

  일반적으로 하나의 트랜잭션은 여러 SQL 문장을 포함함

  성공시 모든 연산을 반영, 취소시 모든 연산을 취소함 ==> All or Nothing

 

트랜잭션의 예

- 도서 주문

  재고 수량 감소, 결제, 포인트 적립, 주문 내역 생성

- 계좌 이체

  원 계좌의 잔액 감소, 다른 계좌의 잔액 증가

- 좌석 예약

  좌성 배정, 결제, 예약 내역 생성

 

계좌 이체 트랜잭션 예

- A 계좌에서 B 계좌로 10,000원을 이체 하는 경우

- 일관성(Consistency) : 이제 전과 이체 후의 (A+B)의 값은 동일해야 함

  "데이터베이스에 데이터가 항상 정확하고 유효하게 유지된다"

 

A와 B의 합이 계좌 이체 후에도 동일해야함

 

[트랜잭션의 특성 (ACID 특성)]

특성 설명
원자성
(Atomicity)
트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않은
상태로 남아 있어야 함(all or nothing)
일관성
(Consistency)
트랜잭션 실행 전후의 데이터베이스 상태가 모든 제약 조건과 규칙을 만족해야 함
고립성
(Isolation)
트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아서는 안됨
지속성
(Durablilty)
트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로
저장되어야 함

=> 원자성 + 고립성을 통해 일관성이 보장되며, 그 상태가 지속성을 통해 유지됨

 

[트랜잭션의 격리 수준과 읽기 문제]

- Dirty Read

  Commit 되지 않은 데이터를 읽는 현상

트랜잭션 (Time)T1 T2 T3 T4 T5
X READ(A)   READ(B)   COMMIT
Y   UPDATE(B <-- b + 10000)   ROLLBACK  

Commit 된 데이터만 읽게 함으로써 해결 (Read Commited)

 

- Non-Repeatable Read

  동일한 쿼리의 반복 실행 중, 다른 트랜잭션이 수정, 삭제 연산을 실행하여 두 쿼리의 결과가 달라지는 현상

트랜잭션 T1 T2 T3 T4 T5
X READ(A)     READ(B) COMMIT
Y   UPDATE(A <-- A + 10000) COMMIT    

  한 트랜잭션이 읽은 행을 다른 트랜잭션이 수정, 삭제하지 못하도록 잠금으로써 해결(Repeatable Read)

 

- Phantom Read

  동일한 쿼리의 반복 실행 중, 다른 트랜잭션이 삽입 연산을 실행하여 두 쿼리의 결과가 달라지는 현상

  Repeatable Read 정책은 새로 추가되는 행에 대해서는 적용되지 않기 때문

트랜잭션 T1 T2 T3 T4 T5
X Count(*)     Count(*) COMMIT
Y   INSERT new record COMMIT    

실제로는 여러 트랜잭션이 병렬로 수행되지만, 그 결과는 트랜잭션들이 순차적으로 하나씩 실행된 결과와 동일하게

보장함으로써 해결(Serializable Schedule)

 

- Serializable Schedule

  동시성 제어기(Concurrency Controller)를 통해 생성

  Locking 기반, Timestamp 기반

 

[트랜잭션의 격리 수준과 읽기 문제]

격리 수준 설명 읽기 문제
Dirty Read Non-Repeatable Read Phantom Read
Read
Uncommitted
다른 트랜잭션이 수정 중인 데이터를 읽을 수 있음 발생 가능 발생 가능 발생 가능
Read
Committed
Commit 된 데이터만 읽을 수 있음 방지됨 발생 가능 발생 가능
Repeatable
Read
한 트랜잭션이 릭은 행을
다른 트랜잭션이 수정, 삭제하지 못함
방지됨 방지됨 발생 가능
Serializable 트랜잭션 간 순차적 실행과
동일한 결과를 보장함
방지됨 방지됨 방지됨

 

Commit 실행 전 상태는

  - 변경된 내용은 메모리에 임시로 저장됨

  - 현재 사용자는 증가한 HEIGHT 값을 읽을 수 있음

  - 다른 사용자는 증가 전 HEIGHT 값만 읽을 수 있음

  - HEIGHT에는 잠금(LOCKING)이 설정되어 다른 사용자는 값을 변경할 수 없음

 

Commit 실행 후

  - 변경된 내용은 DB에 저장됨

  - 변경 내용을 모든 다른 사용자가 볼 수 있음

  - 이전 데이터는 모두 사라짐 (별도로 로그 보관시 복구 가능)

  - 관련된 행에 대한 잠금이 해제되어 모든 사용자가 변경할 수 있음

 

트랜잭션을 제어하기 위한 명령어

  - COMMIT : 변경된 내용을 DB에 영구적으로 반영

  - ROLLBACK : 기본 - 변경된 내용을 버리고 변경 전 상태(마지막 COMMIT)로 복귀

  SAVEPOINT를 지정한 경우, 지정한 저장점까지만 복귀

 >> SAVEPOINT : 부분 복귀를 위해 지정한 저장점

 

트랜잭션은 SQL문 실행 시 자동 시작, COMMIT/ROLLBACK 실행시 종료

 

자동 커밋 / 자동 롤백

  - DDL문장 수행 시 DDL 수행 전에 자동으로 커밋(auto commit)

  - DB를 정상적으로 접속 종료하면 자동 커밋

  - 애플리케이션의 이상 종료로 DB와의 접속이 단절되었을 때 자동 롤백

 

ROLLBACK

  - ROLLBACK 이후의 데이터 상태

    변경한 내용이 모두 취소됨

    이전 데이터가 다시 재저장됨

    관련된 행에 대한 잠금이 해제되어 모든 사용자가 변경할 수 있음

 

SAVEPOINT

  - 미리 지정한 SAVEPOINT까지만 ROLLBACK

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

  - 일부 TOOL에서는 지원되지 않음

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

'javaboiii의 DataBase' 카테고리의 다른 글

DB - 다중 행 함수(Multi-Row Function)  (0) 2024.08.20
DB - 서브쿼리(Subquery)  (0) 2024.08.18
DB - DCL(Data Control Language)  (0) 2024.08.15
DB - JOIN  (0) 2024.08.12
DB - REGEXP 함수  (0) 2024.08.10