트랜잭션(Transaction)**은 데이터베이스 시스템에서 데이터베이스의 상태를 변환하는 하나의 작업 단위를 나타냅니다. 트랜잭션은 데이터베이스에서의 작업을 일관되게 수행하기 위해 일련의 연산들을 묶어 관리하는 메커니즘을 제공합니다. 데이터베이스 트랜잭션은 ACID 속성을 만족해야 합니다.
트랜잭션의 ACID 속성
- 원자성 (Atomicity):
- 트랜잭션은 원자적으로 실행되어야 합니다. 즉, 트랜잭션 내의 모든 작업이 완전히 실행되거나 전혀 실행되지 않아야 합니다. 중간 상태는 허용되지 않습니다. 예를 들어, 은행 계좌 이체 작업에서 돈을 송금하고 받는 두 작업이 포함될 때, 둘 중 하나라도 실패하면 전체 작업이 취소되어야 합니다.
- 일관성 (Consistency):
- 트랜잭션이 완료되면 데이터베이스는 일관된 상태를 유지해야 합니다. 데이터베이스의 제약 조건과 규칙이 트랜잭션 후에도 유지되어야 합니다. 트랜잭션의 실행 전후로 데이터베이스의 상태가 변하지 않아야 합니다.
- 격리성 (Isolation):
- 동시에 실행되는 트랜잭션들은 서로에게 영향을 미치지 않아야 합니다. 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션은 그 트랜잭션의 변경 사항을 볼 수 없습니다. 격리 수준에 따라 동시성 문제를 해결합니다.
- 지속성 (Durability):
- 트랜잭션이 완료되면 그 결과는 영구적으로 데이터베이스에 저장되어야 합니다. 시스템 장애가 발생해도 완료된 트랜잭션의 변경 사항은 유지됩니다.
트랜잭션의 상태
트랜잭션은 여러 상태를 가질 수 있습니다:
- 활성 (Active): 트랜잭션이 시작되었지만 아직 완료되지 않은 상태입니다.
- 커밋 (Committed): 트랜잭션이 성공적으로 완료되어 데이터베이스에 영구적으로 적용된 상태입니다.
- 롤백 (Rolled Back): 트랜잭션이 실패하여 모든 변경 사항이 취소되고, 데이터베이스가 이전 상태로 복원된 상태입니다.
- 준비 (Prepared): 분산 트랜잭션에서 트랜잭션이 준비 상태로, 모든 참여자가 트랜잭션을 커밋할 준비가 된 상태입니다.
트랜잭션 제어 명령어
- BEGIN TRANSACTION:
- 트랜잭션의 시작을 명시합니다. 일부 데이터베이스 시스템에서는 START TRANSACTION 또는 BEGIN 명령어를 사용합니다.
sql코드 복사BEGIN TRANSACTION; - COMMIT:
- 트랜잭션의 모든 작업을 데이터베이스에 영구적으로 적용합니다. 트랜잭션이 성공적으로 완료되었을 때 사용합니다.
sql코드 복사COMMIT; - ROLLBACK:
- 트랜잭션이 실패했을 때, 트랜잭션이 시작되기 전의 상태로 데이터를 되돌립니다. 모든 변경 사항이 취소됩니다.
sql코드 복사ROLLBACK; - SAVEPOINT:
- 트랜잭션 내에서 중간 상태를 저장하여, 트랜잭션의 특정 지점으로 되돌릴 수 있도록 합니다.
sql코드 복사SAVEPOINT savepoint_name; ROLLBACK TO SAVEPOINT savepoint_name;
트랜잭션의 격리 수준
트랜잭션의 격리 수준은 동시 실행되는 트랜잭션 간의 상호작용을 제어합니다. 격리 수준은 트랜잭션의 성능과 일관성 간의 균형을 맞추는 데 도움을 줍니다. 주요 격리 수준은 다음과 같습니다:
- 읽기 미확인 (Read Uncommitted):
- 트랜잭션이 아직 커밋되지 않은 변경 사항도 다른 트랜잭션에서 읽을 수 있습니다. 가장 낮은 격리 수준으로, 더티 읽기(Dirty Read)가 발생할 수 있습니다.
- 읽기 확인 (Read Committed):
- 트랜잭션이 커밋된 데이터만 읽을 수 있습니다. 더티 읽기는 방지되지만, 비 반복 읽기(Non-repeatable Read)가 발생할 수 있습니다.
- 반복 가능한 읽기 (Repeatable Read):
- 트랜잭션이 시작된 시점의 데이터 상태를 보장합니다. 더티 읽기와 비 반복 읽기는 방지되지만, 팬텀 읽기(Phantom Read)가 발생할 수 있습니다.
- 직렬화 (Serializable):
- 가장 높은 격리 수준으로, 트랜잭션들이 직렬화된 것처럼 작동하여 동시성 문제를 완전히 방지합니다. 모든 읽기와 쓰기가 순차적으로 발생하는 것처럼 보장됩니다.
트랜잭션의 중요성
트랜잭션은 데이터베이스에서 데이터의 무결성과 일관성을 유지하는 데 필수적입니다. ACID 속성을 충족하는 트랜잭션은 시스템의 신뢰성을 높이고, 여러 사용자가 동시에 데이터를 처리할 때 발생할 수 있는 문제를 해결합니다. 트랜잭션을 통해 복잡한 데이터베이스 작업을 안전하게 수행하고, 시스템 장애나 오류로부터 데이터베이스를 보호할 수 있습니다.