Transaction
Transaction in Data System
데이터 시스템에서는 하드웨어, 애플리케이션, 네트워크 그리고 클라이언트의 요청 등 다양한 원인에 의해 데이터에 문제가 발생할 수 있다. 이러한 결함이 전체 시스템의 장애로 이어지지 않도록 내결함성을 지닌 시스템을 설계하는 것이 중요하다.
트랜잭션은 내결함성을 위한 메커니즘 중 하나로, 애플리케이션의 동시성 문제와 하드웨어/소프트웨어적 결함이 존재하지 않는 것처럼 동작하도록 돕는 추상층이다. 트랜잭션은 애플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶어 전체가 성공하거나 실패하도록 설계되었기 때문에 부분 실패가 방지되어 오류 처리를 수월하게 한다. 또한, 트랜잭션이 잠재적인 오류나 동시성 문제의 해결 주체를 애플리케이션에서 데이터베이스로 옮겨오면서, 애플리케이션 프로그래밍 모델이 단순화되는 효과가 있다. 애플리케이션은 어보트 상태의 트랜잭션을 재시도만 하면 된다.
그러나 어떤 애플리케이션은 트랜잭션이 필요하지 않거나, 완화된 트랜잭션을 보장하여 성능을 향상시키거나 가용성을 높이는 것이 더 중요한 경우도 있다. 따라서 트랜잭션의 안정성 측면에서의 이점과 성능/가용성 측면에서의 비용을 이해하고 사용하는 것이 중요하다.
현대의 거의 모든 관계형 데이터베이스(RDBMS)와 일부 비관계형 데이터베이스(NoSQL)는 트랜잭션을 지원하지만, 세부 구현 측면에서 일부 차이를 보인다. 비관계형 데이터베이스는 2000년대 후반 관계형 데이터베이스의 상황을 개선하기 위해 새로운 데이터 모델과 복제, 파티셔닝을 제공하며 큰 인기를 얻었다. 동시에 확장을 통한 성능 향상과 고가용성이 강조되었던 새로운 데이터베이스에서는 트랜잭션의 엄격한 보장과 성능 간 trade-off 관계를 염두하며 트랜잭션의 의미가 일부 재정의되었다.
Transaction: ACID
트랜잭션이 제공하는 안전성 보장은 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)를 의미하는 약어인 ACID라고 표현한다. ACID를 준수하는(ACID compliant) 시스템을 이해하기 위해 각 요소에 대해 자세히 살펴보자.
원자성(Atomicity)
클라이언트의 쓰기 요청을 처리하던 중 프로세스가 죽거나 네트워크 연결이 끊기고, 디스크가 가득차거나, 데이터가 정합성 제약 조건을 위반하면 결함이 발생할 수 있다. 여러 작업이 실행되던 중 오류가 발생하면 적용된 변경사항이 어떤 것인지 파악하기 어렵고, 데이터가 중복되거나 잘못된 데이터가 생성될 수 있다. 그런데 트랜잭션이 어보트되었다면, 애플리케이션에서 트랜잭션이 데이터베이스의 어떠한 것도 변경하지 않았음을 보장하므로, 안전하게 재시도할 수 있다. 원자성이란 결함이 발생했다면 트랜잭션을 어보트하고 해당 트랜잭션에서 기록한 모든 내용을 취소하는 특성이다.
일관성(Consistency)
항상 진실이어야 하는 데이터에 관한 불변식(invariant)을 만족시키는 특성을 일관성이라고 한다. 하나의 계좌에서 다른 계좌로 금액을 이체하는 경우 전체 금액의 총합은 늘 일정해야 하는 것와 같이 애플리케이션은 특정한 불변식을 유지할 수 있도록 트랜잭션을 정의할 수 있다.
격리성(Isolation)
서로 다른 클라이언트들이 동일한 데이터베이스 레코드에 접근하면 동시성 문제(경쟁 조건)에 맞닥뜨리게 된다. 변경 사항이 반영되기 이전 동일 레코드에 새로운 쓰기 작업이 수행되면 애플리케이션이 의도한 것과 다른 결과가 쓰일 수 있다. 데이터베이스는 여러 트랜잭션이 동시에 실행됐더라도 트랜잭션이 커밋됐을 때의 결과가 트랜잭션이 순차적으로 실행됐을 때의 결과와 동일하도록 보장한다. 직렬성 격리(serializable isolation)은 트랜잭션의 점유로 인한 성능 손해를 동반하므로, 현실에서는 스냅숏 격리 등의 완화된 격리 수준을 제공한다.
지속성(Durability)
지속성은 하드웨어 결함이나 데이터베이스의 오류가 발생해도 트랜잭션이 성공적으로 커밋됐다면 기록한 모든 데이터가 손실되지 않는다는 보장이다. 단일 노드 데이터베이스에서 데이터가 하드디스크나 SSD와 같은 비휘발성 저장소에 기록되었거나 복제 기능이 있는 데이터베이스에서는 데이터가 다른 노드에 복사되었음을 의미한다. 현실에서 절대적 보장을 제공하기 위한 방법은 존재하지 않는다. 따라서 백업 등의 도구를 통해 위험을 줄이는 것이 필요하다.
Reference
데이터 중심 애플리케이션 설계 (Chapter 7). 마틴 클레프만 지음.