ACID - Atomicity, Consistency, Isolation, Durability
ACID는 database transaction의 안전한 수행을 보장하기 위한 네 가지 핵심 특성입니다.
ACID - Transaction의 핵심 속성
-
ACID는 Atomicity, Consistency, Isolation, Durability의 첫 글자를 따서 만든 약어이며, database transaction의 안전성을 보장하기 위한 4가지 핵심 속성입니다.
-
이 속성들은 database system이 data의 무결성과 일관성을 유지하면서 동시성을 제어할 수 있도록 합니다.
Atomicity (원자성)
-
원자성은 transaction의 모든 operation이 완전히 실행되거나 전혀 실행되지 않아야 한다는 속성입니다.
-
transaction 내의 여러 operation 중 하나라도 실패하면, 전체 transaction이 취소되고 database는 transaction 실행 이전 상태로 복구됩니다.
- “All or Nothing” 원칙이라고도 불리며, data의 부분적 변경을 방지합니다.
- 예를 들어, 계좌 이체 transaction에서 출금과 입금이 모두 성공하거나 모두 실패해야 합니다.
- 출금만 성공하고 입금이 실패하는 경우, 출금도 취소되어 원래 상태로 복구됩니다.
- database system은 rollback 기능을 통해 원자성을 보장합니다.
Consistency (일관성)
-
일관성은 transaction 실행 전후에 database가 항상 유효한 상태를 유지해야 한다는 속성입니다.
-
database에 정의된 모든 제약 조건, 규칙, 관계가 transaction 완료 후에도 만족되어야 합니다.
- 일관성은 business logic과 database schema의 무결성을 보장합니다.
- 예를 들어, 계좌 잔액이 음수가 될 수 없다는 제약 조건이 있다면, transaction 후에도 이 조건이 유지되어야 합니다.
- foreign key 관계, unique 제약 조건, check 제약 조건 등이 모두 만족되어야 합니다.
- database system은 제약 조건 검사를 통해 일관성을 보장합니다.
Isolation (격리성)
-
격리성은 동시에 실행되는 여러 transaction이 서로 간섭하지 않고 독립적으로 실행되어야 한다는 속성입니다.
-
각 transaction은 다른 transaction의 중간 결과를 볼 수 없으며, 마치 혼자 실행되는 것처럼 동작해야 합니다.
- 격리성은 동시성 제어를 통해 구현되며, 여러 격리 수준이 존재합니다.
- Read Uncommitted : 가장 낮은 격리 수준으로, dirty read가 발생할 수 있습니다.
- Read Committed : committed된 data만 읽을 수 있어 dirty read를 방지합니다.
- Repeatable Read : 동일한 query를 반복 실행해도 같은 결과를 보장합니다.
- Serializable : 가장 높은 격리 수준으로, transaction이 순차적으로 실행되는 것과 같은 결과를 보장합니다.
- lock, timestamp, multiversion concurrency control 등의 기법을 사용합니다.
Durability (지속성)
-
지속성은 성공적으로 완료된 transaction의 결과가 영구적으로 database에 저장되어야 한다는 속성입니다.
-
system 장애나 전원 차단 등의 문제가 발생해도 commit된 transaction의 변경 사항은 손실되지 않아야 합니다.
-
지속성은 database의 신뢰성을 보장하는 핵심 요소입니다.
- transaction이 commit된 후에는 해당 변경 사항이 비휘발성 저장 장치에 안전하게 기록됩니다.
- write-ahead logging(WAL) 기법을 사용하여 변경 사항을 먼저 log에 기록한 후 실제 data를 변경합니다.
- checkpoint와 recovery 메커니즘을 통해 system 재시작 시 committed transaction을 복구합니다.
ACID 속성의 trade-off
-
ACID 속성을 모두 만족하면 database의 안전성은 높아지지만, 성능과 동시성에는 제약이 따릅니다.
-
특히 격리성을 높이면 동시성이 감소하고, 지속성을 보장하면 write 성능이 저하될 수 있습니다.
- 따라서 application의 요구 사항에 따라 적절한 격리 수준을 선택하고 성능을 최적화해야 합니다.
- OLTP system(Online Transaction Processing)에서는 높은 격리성과 지속성이 중요합니다.
- 대용량 data 처리나 분석 system에서는 성능을 위해 일부 ACID 속성을 완화하기도 합니다.
- NoSQL database 중 일부는 성능과 확장성을 위해 ACID 속성을 부분적으로 지원하기도 합니다.
Reference
- https://en.wikipedia.org/wiki/ACID
- https://www.ibm.com/docs/en/cics-ts/5.4?topic=processing-acid-properties-transactions