트랜잭션
- 데이터베이스의 논리적 연산 단위
의미적으로 분할할 수 없는 최소의 단위
일반적으로 하나의 트랜잭션은 여러 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 |