트랜잭션 (Transaction)
트랜잭션은 데이터베이스 상에서 하나의 논리적 작업 단위로 취급된다. 즉, 개별적인 UPDATE
나 CREATE
구문 단위가 아니라, 사용자가 의도하는 전체 작업 흐름을 하나의 묶음으로 보고 처리한다는 뜻이다. 이 단위 안에서는 모든 연산이 한꺼번에 성공하거나, 어느 하나라도 실패하면 전체를 되돌려 장애 상황에서도 불완전한 상태가 남지 않도록 보장한다. 이렇게 하나의 논리적 단위로 처리함으로써 데이터 무결성(integrity)과 일관성(consistency)을 유지할 수 있으며, 동시에 여러 사용자가 접근할 때도 안전하게 작업이 이루어지도록 돕는다.
예를 들어 은행에서 이체하는 경우를 생가하자. 만약 A가 B에게 5,000원을 이체한다면 A 계좌에서는 5,000원이 차감되고 B 계좌에서는 5,000원이 증가해야 한다. 이 과정은 각각 UPDATE
문으로 처리될텐데, A 계좌 갱신은 정상적으로 완료되었으나 B 계좌 갱신 중 문제가 발생한다면 A 계좌에서만 5,000원이 차감되고 B 계좌에는 입금되지 않는 불완전한 상태가 된다. 이러한 문제를 방지하기 위해 두 개의 UPDATE 문을 단일 트랜잭션으로 묶어 오류 발생 시 A 계좌의 차감도 함께 롤백되도록 보장한다.
특성
트랜잭션은 원자성(atomicity), 일관성(consistency), 격리성(isolation), 지속성(durability)이라는 네 가지 특성을 가진다. 먼저 원자성은 트랜잭션을 구성하는 모든 연산이 전부 성공하거나, 전혀 실행되지 않은 것처럼 처리되어야 한다는 모 아니면 도(all or nothing)의 개념을 의미한다. 즉, 트랜잭션 수행 중 장애가 발생하면 그동안 수행된 모든 연산을 취소하고, 데이터베이스를 트랜잭션 시작 이전의 상태로 되돌려야 한다. 이를 보장하기 위해 시스템은 장애 발생 시 데이터를 복구할 수 있는 회복 기능을 갖추고 있어야 한다.
일관성은 트랜잭션이 실행되기 전과 실행된 후에 데이터베이스가 항상 일관된 상태를 유지해야 함을 의미한다. 즉, 트랜잭션 수행 중 일시적으로 제약조건이 깨질 수는 있지만, 트랜잭션이 정상적으로 종료되면 데이터는 반드시 모든 무결성 제약과 비즈니스 규칙을 만족하는 상태여야 한다. 예를 들어, 계좌 이체의 경우 트랜잭션이 수행되기 전과 후의 전체 계좌 금액 합계는 변함이 없어야 한다.
격리성은 하나의 트랜잭션이 완료되기 전까지 다른 트랜잭션이 그 트랜잭션의 중간 연산 결과에 접근하지 못하도록 하는 성질을 말한다. 이를 통해 여러 트랜잭션이 동시에 실행되더라도 서로 간섭하지 않도록 하여, 마치 트랜잭션들이 순차적으로 하나씩 실행된 것처럼 일관된 결과를 보장할 수 있다. 이러한 격리성을 유지하기 위해 데이터베이스는 동시성 제어 기법을 사용하여 트랜잭션 간의 충돌을 방지하고 정합성을 유지한다.
지속성은 트랜잭션이 성공적으로 완료된 후에는 그 수행 결과가 영구적으로 데이터베이스에 반영되어야 함을 의미한다. 즉, 시스템에 장애가 발생하더라도 이미 처리된 데이터는 손실되지 않고 그대로 유지되어야 한다. 이를 보장하기 위해 데이터베이스는 장애 발생 시 복구 가능한 회복 기능이 있어야 한다.
커밋과 롤백
트랜잭션이 정상적으로 완료되었음을 선언하는 연산을 커밋(commit)이라 하며, 트랜잭션 수행 중 문제가 발생하여 이를 취소하고자 할 때 사용하는 연산을 롤백(rollback)이라 한다. 커밋이 수행되면 트랜잭션의 모든 연산 결과가 데이터베이스에 영구적으로 반영되며, 데이터는 일관된 상태를 유지해야 한다. 반대로 롤백이 수행되면 트랜잭션에 포함된 모든 연산이 취소되고, 데이터베이스는 트랜잭션이 시작되기 전의 상태로 되돌아가야 한다.
트랜잭션의 상태는 정상적인 경우와 비정상적인 경우로 나눌 수 있다. 정상적인 동작에서는 트랜잭션이 활동(active) 상태, 부분 완료(partially committed) 상태, 완료(committed) 상태를 거친다. 활동 상태는 트랜잭션이 실행 중인 단계로, 여러 연산이 수행되고 있는 상태를 의미한다. 부분 완료 상태는 트랜잭션의 모든 연산이 성공적으로 실행된 직후의 상태로, 아직 커밋이 이루어지지 않은 단계이다. 완료 상태는 커밋 연산이 수행되어 트랜잭션이 성공적으로 종료된 상태로, 이 시점에서 모든 변경 내용이 데이터베이스에 반영되고 새로운 일관된 상태가 유지된다.
반면, 트랜잭션이 정상적으로 수행되지 못한 경우에는 실패(failed) 상태 또는 철회(aborted) 상태에 진입하게 된다. 실패 상태는 트랜잭션 수행 중 오류나 장애로 인해 작업이 중단된 상태를 말하며, 철회 상태는 실패한 트랜잭션이 롤백 연산을 통해 지금까지 수행된 모든 작업을 취소하고 트랜잭션 이전의 상태로 데이터베이스를 되돌린 상태로 이 후 트랜잭션은 종료된다. 경우에 따라 철회 상태로 종료된 트랜잭션은 다시 수행되거나 폐기된다.
'Computer Science and Engineering > Database' 카테고리의 다른 글
[DB] 병행 수행(concurrency) 및 병행 제어(concurrency control) (0) | 2025.06.04 |
---|---|
[DB] 장애(failure) 및 회복(recovery) (0) | 2025.06.04 |
[DB] 정규화(normalization) 및 정규형(NF, normal form) 단계 (0) | 2025.06.02 |
[DB] 이상 현상(anomaly) 및 함수적 종속성(FD, functional dependency) (0) | 2025.06.02 |
[DB] 인덱스(index) (0) | 2025.06.02 |