트랜잭션(Transaction)의 ACID 속성: 데이터 무결성의 수호자
은행 앱으로 친구에게 10만 원을 이체한다고 상상해 봅시다. 내 통장에서는 10만 원이 빠져나갔는데, 정전이 되어 서버가 꺼지는 바람에 친구 통장에는 돈이 안 들어갔다면? 이런 끔찍한 사태를 막기 위해 데이터베이스에는 **트랜잭션(Transaction)**이라는 개념이 있습니다. 트랜잭션은 **"더 이상 쪼갤 수 없는 작업의 단위"**를 의미합니다.
트랜잭션이 안전하게 처리됨을 보장하는 4가지 성질, 일명 ACID에 대해 알아봅니다.
1. Atomicity (원자성)
"All or Nothing". 트랜잭션 내의 모든 작업은 전부 성공하거나, 아니면 전부 실패해야 합니다. 어중간하게 실행된 상태는 없습니다. 이체 과정이 (1) 내 돈 차감 -> (2) 친구 돈 입금 이라면, (2)에서 실패하면 (1)도 취소(Rollback)되어야 합니다.
2. Consistency (일관성)
트랜잭션이 성공적으로 완료되면 데이터베이스는 언제나 일관된 상태를 유지해야 합니다. 예를 들어 '잔고는 마이너스가 될 수 없다'는 제약 조건(Constraint)이 있다면, 트랜잭션 후에도 이 규칙은 지켜져야 합니다. 규칙을 위반하는 트랜잭션은 거부됩니다.
3. Isolation (격리성)
여러 트랜잭션이 동시에 실행될 때, 서로에게 영향을 주지 않고 독립적으로 실행되어야 합니다. 내 통장 잔고를 조회하는 동안에는, 다른 트랜잭션이 내 잔고를 수정하지 못하게 막아야 합니다. 격리 수준(Isolation Level)을 높일수록 데이터 안전성은 올라가지만 시스템 성능(동시성)은 떨어지는 트레이드오프가 있습니다. (Read Uncommitted < Read Committed < Repeatable Read < Serializable)
4. Durability (지속성)
트랜잭션이 성공적으로 커밋(Commit)되었다면, 그 결과는 영구적으로 반영되어야 합니다. 그 직후에 시스템이 다운되거나 화재가 나도, 로그를 통해 복구할 수 있어야 합니다.
ACID는 데이터베이스의 신뢰성을 지탱하는 4개의 기둥입니다. 개발자가 COMMIT과 ROLLBACK을 적절히 사용하여 이 원칙을 지키는 것이 중요합니다.