Transaction은 DB에서 수행하는 작업의 최소 단위이며 데이터베이스의 무결성을 유지하며 데이터 처리 기능을 수행한다.
무결성을 지키는 예시로는 은행 계좌 송금이 있으며 A가 B에게 송금을 할 때 A의 출금과 B의 입금을 하나의 Transaction으로 묶어 처리하는 경우이다. 이렇게 DB에서 데이터를 다룰 때 크리티컬한 장애가 생기지 않도록 일련의 작업을 묶은것 Transaction이라고 한다.
// 트랜잭션 예시
START TRANSACTION
// (1) A 계좌 잔액 가져옴 A = 100
// (2) B 계좌 잔액 가져옴 B = 100
// (3) A 출금 A = A - 10
// (4) B 입금 B = B + 10
UPDATE Customer SET balance = balance - 10 WHERE name='A';
UPDATE Customer SET balance = balance + 10 WHERE name='B';
//COMMIT
// (5) A 계좌 잔액 저장 A = 90
// (6) B 계좌 잔액 저장 B = 110
COMMIT
사진예시
ACID는 원자성, 일관성, 고립성, 지속성의 약자이다.
원자성(Atomicity): 트랜잭션 안의 작업들이 전부 수행되지 않았다면 수행을 하지 않은것으로 간주(all or nothing)
일관성(Consistency): 트랜잭션이 일어난 후에도 DB가 일관성 있게 유지 되는 성질(송금 전후 데이터 타입이 int로 동일)
고립성(Isolation): 트랜잭션이 여러개 동시 수행 될 때 각 트랜잭션간에 데이터 연산 작업 시 충돌이 일어나지 않도록 제어해주는 성질(Concurrency control 이라고도 불리며 같은 리소스 A를 사용할 때 1번 트랜잭션에서 A에 Lock를 걸고 사용하는 중이면 Unlock이 될 때까지 다른 2,3번 트랜잭션 실행 중 A리소스를 접근하지 못하게 한다.)
지속성(Durability): 트랜잭션에서 성공적으로 수행이 완료되면 DB에 수행 내용이 꼭 반영이 되야하는 성질( commit 응답이 완료되고 DB의 변경사항이 DISK에 반영되기전에 장애가 일어나도 LOG를 읽어 장애 처리 후에 commit 내용을 반영)
DB의 교착상태(Deadlock)는 여러 트랜잭션 사이에 서로 같은 리소스들을 사용할 때 서로 상대방의 리소스의 Unlock 상태를 영원히 기다리는 상태를 뜻한다.
Deadlock의 해결방법으로는
1. 예방: trasaction에 사용되는 모든 데이터를 Locking 해준다.
2. 회피: 자원 할당시 timestamp를 활용해 교착상태가 일어나지 않도록 하는 알고리즘 적용.
3. 탐지, 회복: 트랜잭션이 실행되는 동안 검사 수행X, Deadlock이 발생할 때 감지하여 회복하는 방법.