DATABASE 트랜잭션 기초
트랜잭션이란?
데이터베이스의 조건
✔️ 다수 사용자가 동시에 사용해도 모순없이 정확한 데이터 유지해야함
✔️ 장애 발생시에도 빠르게 복구할 수 있어야 함
트랜잭션
✔️ DB 회복, 병행 제어를 가능하게 해 일관된 상태를 유지하게 해줌
✔️ 하나의 작업을 수행하는 데 필요한 DB 연산들을 모아둔 것 (DB의 논리적 작업 단위)
ex. 계좌이체 트랜잭션 → 2개의 UPDATE문으로 구성
1) 보내는 사람 잔액 감소
2) 받는 사람 잔액 증가
//1
UPDATE 계좌 SET 잔액 = 잔액 - 5000 WHERE 계좌번호 = 100;
//2
UPDATE 계좌 SET 잔액 = 잔액 + 5000 WHERE 계좌번호 = 200;
ex. 상품주문 트랜잭션 → INSERT, UPDATE문으로 구성
//1
UPDATE 계좌 SET 잔액 = 잔액 - 5000 WHERE 계좌번호 = 100;
//2
UPDATE 계좌 SET 잔액 = 잔액 + 5000 WHERE 계좌번호 = 200;
트랜잭션의 특성 : ACID
Atomicity 원자성
✔️ 트랜잭션을 구성하는 연산들이 모두 정상 or 모두 실패여야한다는 특성 (all-or-nothing)
✔️ 장애 발생시 연산처리를 싹다 취소하고 작업전 상태로 돌아가야함
→ 일부처리만 반영해서는 안됨!
Consistency 일관성
✔️ 트랜잭션의 성공적 수행 후에도 DB가 일관된 상태를 유지해야함 (병행제어 기능)
✔️ 트랜잭션 수행 중에는 잠시 일관성을 잃을 수 있지만, 완료 후에는 반드시 모순없이 일관되어야한다!
Isolation 격리성
✔️ 수행중인 트랜잭션이 완료될 때까지, 중간 연산 결과에 다른 트랜잭션들이 접근할 수 없음 (병행제어 기능)
✔️ 여러 트랜잭션이 동시에 수행되는데, 각 트랜잭션은 독립적으로 수행되어야함
(순서대로 하나씩 수행되는 것과 같은 결과를 얻을 수 있도록)
ex. 계좌이체
A 가 B에게 5000원을 갚음
B가 용돈 1000원을 받음
⇒ 차례로 더해져 총 6000이 B에게 더해져야 하는데, 중간에 서로 접근하면 5000원같은 이상한 결과가 나올 수도 있게됨
Durability 영속성
✔️ 트랜잭션의 성공 완료 후 DB에 반영한 수행 결과는 손실되지 않고 영구적이어야 함 (회복 기능)
✔️ 시스템 장애에도 작업결과는 그대로 DB에 남아있어야 함
트랜잭션 연산
commit 연산
✔️ 트랜잭션의 성공적 수행을 선언 (작업 완료)
✔️ commit 실행 후에야 트랜잭션 수행 결과가 DB에 반영됨 → 일관성 유지 가능
rollback 연산
✔️ 트랜잭션 수행 실패를 알림 (작업 취소)
✔️ 지금까지 실행한 연산 결과가 취소, 수행 전 상태로 돌아감 → 모순 방지
트랜잭션 상태
트랜잭션은 아래 다섯개 상태 중에 하나가 된다. 실행단계를 시작으로 부분 완료 상태가 되고, 실패 혹은 완료로 넘어간다. 성공시에는 commit으로 완료가 되고 실패 후에는 철회를 함으로써 트랜잭션을 종료한다.