[데이터베이스] 트랜잭션과 ACID
트랜잭션이란?
트랜잭션은 은행 ATM이나 데이터베이스등의 시스템에서 사용되는 더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다.
예를 들어 A가 B의 계좌로 1000원을 입금하는 행위가 발생할 때,
"A의 계좌에서 1000원이 빠진다." 와 "B의 계좌에 1000원이 더해진다."는 더 이상 쪼갤 수 없는 최소 단위라고 할 수 있다.
이는 즉, A가 돈을 지불하는 행위와 B가 돈을 받는 행위가 분리될 수 없으며 하나의 작업으로 묶여야한다는 것을 의미한다.
트랜잭션의 특징
→ 데이터베이스 작업에서 오류가 발생할 경우 데이터를 복구하는 단위가 된다.
→ 데이터베이스에서 한 번에 여러가지 작업이 일어날 때, 이것들을 분리해주는 작업 단위가 된다.
→ 트랜잭션은 묶인 작업이 모두 실행되거나 모두 실행되지 않아야한다. (All or Nothing)
커밋(Commit)과 롤백(Rollback)
커밋 (Commit)
하나의 트랜잭션이 문제 없이 완료된 후 데이터베이스가 다시 일관성을 유지하게 됐을 때 트랜잭션이 완료되었음을 관리자에게 알려주는 것
롤백 (Rollback)
트랜잭션 중 문제가 발생하였을 때, 지금까지의 작업을 다시 원래 상태로 되돌리는 행위
트랜잭션 과정
- BEGIN
- 트랜잭션을 명시적으로 시작하며 Active 상태에 들어간다.
- EXECUTION
- 트랜잭션에 포함된 연산들을 차례로 실행한다. 커밋되기 전까지를 Partially Committed 상태라고 할 수 있다.
- COMMIT
- 모든 EXECUTION이 완료된 후, 오류가 발생하지 않았다면 트랜잭션이 완료되었음을 관리자에 알린다.
트랜잭션의 성질 (ACID)
트랜잭션이 제대로 구성되지 않았을 때, 데이터베이스에 심각한 손상을 끼칠 수 있다.
A가 B에게 1000원을 입금하는 과정에서 A의 계좌에서는 성공적으로 1000원이 마이너스 되었지만 B의 계좌에 1000원을 더하는 과정에서 오류가 발생하여 연산이 반영되지 않는다면 돈을 보낸 사람은 있지만 받은 사람은 없게 되는 상황이 발생하게 된다.
만약 은행에서 비슷한 일이 발생하게 된다면 아무도 그 은행을 이용하려 하지 않을 것이다.
결국 트랜잭션을 사용하는 이유는 이러한 발생 가능한 여러가지 오류들에 대하여 데이터베이스를 안전하게 지키고 유지하는데 있다고 할 수 있겠다.
그리고 트랜잭션은 데이터베이스를 관리하기 위해 ACID라는 네 가지 원칙(성질)을 세운다.
1. 원자성 (Atomicity)
- 원자는 더 이상 쪼개질 수 없는 물질의 가장 작은 단위이다. 트랜잭션이 원자성을 유지한다는 것은 앞서 말한 가장 작은 작업 단위를 유지한다는 것을 의미하며, 하나가 실패하면 해당 트랜잭션에 포함된 모든 다른 작업들도 실패시켜야한다는 의미이다.
2. 일관성 (Consistency)
- 데이터베이스가 가지고 있는 고정요소는 트랜잭션이 일어나기 전이나 후나 같아야한다.
3. 격리성 (Isolation)
- 서로 다른 트랜잭션은 서로 간의 존재를 모르고 독립적으로 수행되어야 한다. 하나의 트랜잭션에 대해 다른 트랜잭션은 끼어들거나 간섭할 수 없다.
4. 영속성 (Duration)
- 트랜잭션이 한 번 반영되고 나면 해당 내용은 데이터베이스(하드디스크)에 확실히 기록되어야한다.