트랜잭션(transaction) ACID
1. Transaction
트랜잭션(transaction)은 완결성 있게 처리되어야 하는 하나의 논리적인 작업 단위를 의미한다. 논리적 작업 단위 내에는 여러 동작(질의, query)이 존재하며 이들은 모두 실행되거나 모두 실행되지 않아야 한다.
- 작업 단위가 중간에 실패한다면 이를 롤백(rollback)하여 이전 상태로 되돌린다.
- 작업 단위가 모두 성공한다면 커밋(commit)하여 현재 데이터 상태를 확정지어야 한다.
트랜잭션은 작업 수행의 논리적 단위이기 때문에 DBMS(Database Management System)에서는 TPS(Transaction Per Second)
로 성능을 측정한다. 트랜잭션은 데이터의 부정합성을 방지하기 위해 사용한다.
2. ACID
데이터베이스 트랜잭션이 가져야 하는 ACID
특징에 대해 살펴본다. 우선 원자성(Atomic)은 다음과 같은 특징을 의미한다.
- 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장한다.
All or Nothing
의 개념으로서 작업 단위의 일부분만 실행하지 않는다는 것을 의미한다.- 커밋 이전 상태를 롤백 세그먼트(rollback segment)라는 임시 영역에 저장하고 트랜잭션에 의해 내용들을 변경해 나간다.
- 트랜잭션이 실패하는 경우 수행한 내용들을 삭제하고 롤백 세그먼트에 있는 데이터 상태로 롤백한다.
은행 계좌 이체를 예로 들어보겠다. A 계좌에서 100,000원을 출금하고 B 계좌에 100,000원을 입금하는 작업이 하나의 트랜잭션이다. 만약 출금은 성공했지만 입금 도중에 오류가 발생하면, 출금한 돈은 다시 A 계좌로 복구되어야 한다. 즉, 두 작업 모두 완료되거나, 둘 다 실행되지 않아야 한다. 부분적으로만 실행되는 경우가 없어야 하는 것이 원자성이다.
일관성(Consistency)은 다음과 같은 특징을 의미한다.
- 트랜잭션을 마친 후의 데이터베이스 상태는 트랜잭션 시작 전 상태와 동일하게 정상 상태를 유지해야 한다.
- 트랜잭션 수행 후에도 데이터 모델의 제약 조건(기본키, 외래키, 도메인, 도메인 제약조건 등)을 만족하게 함으로써 일관성을 보장한다.
쇼핑몰 주문 시스템을 예로 들어보자. 주문이 완료되면 재고가 감소하고 주문 내역이 저장된다. 이 때, 데이터베이스 제약조건으로 재고가 0 이하가 될 수 없도록 설정되어 있다. 트랜잭션이 성공적으로 완료되면 재고 감소와 주문 기록이 모두 반영되어 데이터 일관성이 유지된다. 만약 재고가 부족한 상태라면 트랜잭션이 롤백되어 일관성이 유지된다.
격리성(Isolation)은 다음과 같은 특징을 의미한다.
- 여러 클라이언트가 데이터베이스에 접속하여 동일한 레코드(record)에 접근할 때 발생하는 동시성 문제를 다루기 위한 특징이다.
- 격리성 수준(level)에 따라 트랜잭션끼리의 간섭 수준이 결정된다.
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
- 격리 수준에 따라 동시에 실행되는 트랜잭션끼리 영향을 줄 수 있는 정도가 다르며 이로 인해 수행 결과가 바뀔 수도 있다.
- 동시에 실행되는 트랜잭션은 서로를 방해하지 않아야 하므로 적절한 격리 수준이 요구된다.
일관성과 동일하게 주문 시스템을 예로 들어본다. 두 사용자가 동시에 같은 상품을 구매하려고 할 때, 재고가 1개 남아 있다고 가정한다. 각각의 트랜잭션은 독립적으로 처리되어야 하며, 한 사용자의 구매가 완료되기 전까지 다른 사용자는 재고가 1개 있는 상태만 보아야 한다. 격리성이 낮으면 두 사용자가 동시에 구매해서 재고가 음수가 될 수 있다. 적절한 격리수준을 통해 이런 문제를 방지한다.
지속성(Durability)은 다음과 같은 특징을 의미한다.
- 성공적으로 수행된 트랜잭션의 결과가 데이터베이스에 반영되는 것을 의미한다.
- 커밋 수행 이후 현재 상태가 남아 있는 것을 보장한다.
- 데이터베이스가 죽더라도 트랜잭션에서 기록한 모든 데이터는 손실되지 않는 것을 보장한다.
온라인 결제 후 트랜잭션이 커밋되면, 결제 내역은 디스크에 안전하게 저장되어야 한다. 서버가 갑자기 다운되거나 재부팅되더라도 결제 정보가 손실되지 않고 보존되어야 한다. 이것이 지속성이다. 이를 위해 트랜잭션 로그와 같은 기술을 사용한다.
댓글남기기