트랜잭션이란 프로그램 실행의 최소 단위를 의미합니다. 프로그램은 데이터에 접근하거나 데이터를 조작하는 행위로 이루어져 있으며 트랜잭션의 실행 결과는 모든 행위를 실행하거나(Commit) 철회하는(Roll back) 두 가지입니다.
계좌 A에서 50 달러를 인출해 계좌 B에 송금하는 다음과 같은 트랜젝션이 있습니다.
1. read(A)
2. A := A - 50
3. write(A)
4. read(B)
5. B := B + 50
6. write(B)
만약 3단계 이후 그리고 6단계 이전에 트랜잭션이 실패하게 되면, 50 달러는 잃어버려지게 됩니다. (실패의 이유는 Software 혹은 Hardware 문제로 발생할 수 있습니다.) 그렇기 때문에 시스템은 반드시 트랜잭션을 하나의 원자처럼 취급하여 쪼갤수 없게 해야합니다. 즉 트랜잭션이 부분적으로 실행되는 것을 막아야 합니다.
트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다.
트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
모든 단계가 성공적으로 실행되고 시스템에 결과가 반영이 된다면, 시스템이 이후에 고장이 나더라도 해당 결과를 제대로 반영해야합니다.
계좌 A와 B의 합은 트랜잭션 이후에도 바뀌어서는 안됩니다. 즉, 정확하게 트랜잭션이 수행되어야 합니다.
트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다.
시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.
3단계와 6단계 사이에 다른 트랜잭션이 끼어들면, 다른 트랜잭션은 부정확한 결과를 얻을 것입니다. 따라서 이런 독립성을 보장하는 가장 쉬운 방법은 각 트랜잭션이 Serial하게 실행하는 것입니다. (One after One) 하지만 이 방식은 독립성은 보장하지만 시스템이 비효율적으로 동작하게 합니다. 따라서 여러 트랜잭션이 동시에 실행되면서 독립성을 보장할수 있도록 잘 스케줄링을 해야합니다.
둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들 수 없다.
수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
활동(Active) : 트랜잭션의 초기 상태이고 트랜잭션이 실행중일 때도 Active 상태라고 한다.
부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, 아직 Commit이나 Abort(RollBack)는 되지 않은 상태.
실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태 -> Nothing
완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태 -> All