Transaction 이란
DB의 상태를 변환시키는 하나의 논리적인 작업 단위를 구성하는 연산들의 집합이다.
예를 들어, A계좌에서 B계좌로 일정 금액을 이체한다고 가정하자. 이러한 과정은 다음과 같다
a. A계좌의 잔액 확인
b. A계좌의 금액에서 이체할 금액을 빼고 다시 저장
c. B계좌의 잔액을 확인
d. B계좌의 금액에서 이체할 금액을 더하고 다시 저장
a~d의 과정들은 모두 합쳐저 계좌이체라는 하나의 작업단위(트랜잭션)을 구성, 트랜잭션은 항상 all or nothing 원칙을 만족해야 한다. 즉 완료를 하던가(commit) 다시 원래의 상태로 돌아가던가(rollback) 둘중 하나는 만족해야 한다. 절대 partoally Done 형태로 끝나서는 안된다.
트랜잭션의 성질(ACID)
Atomicity(원자성) , All or Nothing
트랜잭션의 모든 연산들은 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다.
Consistency(일관성)
트랜잭션 완료 후에도 데이터베이스가 일관된 상태로 유지되어야 한다. 예를 들어 계좌이체를 성공적으로 실행했다면 A계좌 잔액과 B계좌 잔액의 합이 트랜잭션 실행 전의 합과 동일해야 한다.
Isolation(독립성)
하나의 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못한다. DB는 클라이언트들이 같은 데이터를 공유하는 것이 목적이므로 여러 트랜잭션이 동시에 수행된다. 이 때 트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 한다. 또한 트랜잭션이 실행중인 데이터는 다른 트랜잭션이 동시에 참조하지 못하도록 보장하여야 한다.
Durability(지속성)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다. 즉 완료된 트랜잭션의 결과는 디스크와 같은 보조기억장치에 저장되거나 시스템 장애가 회복되고 난 후에 어떠한 형태로든지 그 데이터를 복구 할 수 있어야 한다.
트랜잭션의 상태
Concurrency Control(동시성 제어)
2개 이상의 트랜잭션이 하나의 값에 접근하는 경우, 어떤 일이 일어나는지 살펴보자. 두개의 트랜잭션 모두 자원에 대한 읽기만 하는 경우에는 문제가 발생하지 않는다. 그렇다면 1개의 트랜잭션이 쓰기 작업을 진행하는 경우에는 읽기 작업을 진행하는 트랜잭션은 유효하지 않은 데이터를 읽는 문제가 발생 할 수있다. 두개의 트랜잭션 모두 쓰기작업을 진행한다면 아래와 같은 문제점들이 발생 할 수 있다.
이와 같이 두개 이상의 트랜잭션이 발생 할 경우 트랜잭션 스케쥴을 이용하거나 Lock이용해 관리한다.
트랜잭션 스케쥴
Lock