데이터베이스의 시스템에서 여러 개의 데이터 조작 작업을 하나의 작업 단위로 묶어서 수행하는 것을 말한다.
데이터베이스의 일관성을 유지하고, 데이터베이스 시스템의 신뢰성을 보장하는 것이다. 이를 위해 트랜잭션은 ACID 원칙을 따른다.
ACID는 원자성(Atomicity), 일관성(Consistency), 격리성/고립성(Isolation), 지속성(Durability)의 첫 글자를 딴 축약단어이다.
원자성은 트랜잭션 내의 모든 작업이 하나의 단위로 처리되며, 중간에 오류가 발생하면 모든 작업이 취소되어 트랜잭션이 시작되기 전 상태로 돌아가야 한다는 원칙이다. 이를 통해 데이터베이스의 상태가 불완전한 중간 상태에 놓이지 않도록 보장한다.
예시: 은행 계좌에서 돈을 송금하는 트랜잭션
송금 트랜잭션은 두 개의 작업을 포함한다. 돈을 송신 계좌에서 차감하고, 수신 계좌에 돈을 추가하는 것이다. 원자성이 보장되면, 두 작업이 모두 성공해야만 데이터베이스가 변경된다. 만약 송신 계좌에서 돈을 차감하는 작업은 성공했지만, 수신 계좌에 추가하는 작업이 실패하면 전체 트랜잭션이 롤백(취소)되어, 송금 전 상태로 복구된다.
일관성은 트랜잭션이 실행되기 전과 후에 데이터베이스가 무결성 제약 조건을 지켜야 한다는 원칙이다. 즉, 트랜잭션이 시작되기 전에 데이터베이스는 유효한 상태여야 하고, 트랜잭션이 완료된 후에도 데이터베이스는 유효한 상태를 유지해야 한다.
예시: 은행 계좌 잔액
은행 계좌에서, 모든 계좌의 잔액이 음수가 될 수 없다는 제약 조건이 있을 때, 송금 트랜잭션이 성공적으로 완료되면 모든 계좌의 잔액이 이 제약 조건을 만족해야 한다. 트랜잭션이 일관성을 유지하도록 보장한다.
격리성은 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 보장한다. 트랜잭션이 실행될 때, 그 결과는 다른 트랜잭션이 완료될 때까지 외부에 노출되지 않는다. 격리성은 여러 트랜잭션이 동시에 수행될 때 데이터의 무결성을 유지하는 데 중요하다.
예시: 두 명의 사용자가 동일한 계좌에서 동시에 돈을 인출할 때
두 명의 사용자가 동일한 계좌에서 동시에 돈을 인출할 때 격리성이 보장되면, 각 트랜잭션은 독립적으로 실행되며, 각 트랜잭션은 데이터베이스의 현재 상태만 참조한다. 따라서 두 트랜잭션이 동시에 실행되어도 데이터베이스는 일관된 상태를 유지할 수 있다.
지속성은 트랜잭션이 완료되면 그 결과가 영구적으로 저장되며, 시스템 장애가 발생해도 데이터가 손실되지 않는다는 원칙이다. 즉, 트랜잭션이 성공적으로 완료된 후에는 데이터베이스의 상태가 지속적으로 유지된다.
예시: 은행 송금중에 시스템 오류가 났을 때
은행의 송금 트랜잭션이 완료된 후, 시스템 장애가 발생하더라도 송금한 금액은이미 수신 계좌에 반영된 상태로 남아야 한다. 이는 지속성 원칙을 통해 보장된다.
트랜잭션이 시작되었고 현재 진행 중인 상태이다.
트랜잭션이 성공적으로 완료되어 데이터베이스에 영구적으로 저장된 상태이다.
트랜잭션이 실패하거나 취소되어, 데이터베이스의 상태가 트랜잭션 시작 전으로 되돌려진 상태이다.
트랜잭션의 구현은 데이터베이스 관리 시스템(DBMS)이 트랜잭션의 ACID 원칙을 보장하기 위해 사용하는 여러 기술적 접근 방식을 포함한다. 트랜잭션이 안정적으로 처리되도록 하기 위해 DBMS는 다양한 방법을 사용하여 데이터의 무결성과 일관성을 유지한다. 주요 구현 기술은 아래의 5가지가 있다.
트랜잭션의 로그는 트랜잭션의 모든 작업을 기록하여 데이터베이스의 상태를 추적하는 데 사용된다. 로그는 두 가지 주요 목적을 가지고 있다.
체크포인트는 데이터베이스의 현재 상태를 특정 시점에 저장하는 과정이다. 체크포인트는 데이터베이스 복구를 간소화하고, 장애 발생 시 복구 시간을 줄이기 위해 사용된다.
주요 기능은 다음과 같다.
트랜잭션이 데이터에 접근할 때 다른 트랜잭션이 동시에 접근하지 못하도록 잠금을 설정한다. 이는 동시성 문제를 해결하여 데이터의 무결성을 보장한다. 여러 트랜잭션이 동시에 실행되더라도 데이터의 일관성과 충돌을 방지한다.
주요 기능은 다음과 같다.
데이터의 여러 버전을 관리하여, 각 트랜잭션이 데이터의 특정 시점에 대한 스냅샷을 사용한다. 이는 동시성 문제를 해결하고 트랜잭션 간의 충돌을 방지한다. MVCC는 트랜잭션이 데이터의 일관된 스냅샷을 읽도록 하여, 다른 트랜잭션의 변경 사항이 영향을 미치지 않도록 한다.
데이터베이스에서 트랜잭션을 시작하고, 커밋하거나 롤백하여 트랜잭션의 결과를 확정하거나 취소하는데 사용된다. 각각의 명령어는 특정 상황에서 데이터베이스 작업의 완료 또는 취소를 명시하는데 중요하며, 대부분의 DBMS에서 공통적으로 지원하고 각 DBMS에 따라 명령어의 구문이 조금씩 다르다.
제어 명령어는 다음과 같다.
트랜잭션을 시작하고, 여러 작업을 하나의 단위로 묶는다.
트랜잭션의 모든 작업이 성공적으로 완료되었을 때, 변경 사항을 데이터베이스에 저장한다.
트랜잭션의 작업 중 오류가 발생했을 때, 변경 사항을 취소하고 데이터베이스를 원래 상태로 되돌린다.
이러한 명령어들을 적절히 사용하여 트랜잭션의 일관성과 안정성을 보자할 수 있다.