데이터베이스 트랜잭션

**데이터베이스 트랜잭션**(database transaction)은 데이터베이스에 대해 수행되는 작업 단위를 상징하며, 데이터베이스 관리 시스템(또는 유사한 시스템) 내에서 다른 트랜잭션과 독립적으로 일관되고 신뢰할 수 있는 방식으로 처리된다. 트랜잭션은 일반적으로 데이터베이스의 모든 변화를 나타낸다. 데이터베이스 환경에서 트랜잭션은 두 가지 주요 목적을 가진다:

# 장애로부터 올바른 복구를 허용하고, 시스템 장애 발생 시에도 데이터베이스의 일관성을 유지할 수 있는 신뢰할 수 있는 작업 단위를 제공하는 것이다. 예를 들어, 실행이 미처 예상치 못하게(전체적 또는 부분적으로) 중단되어 데이터베이스에 대한 많은 작업이 완료되지 않은 채 불분명한 상태로 남는 경우이다.
# 데이터베이스에 동시에 접근하는 프로그램들 사이에 격리성을 제공하는 것이다. 이러한 격리가 제공되지 않으면 프로그램의 결과가 잘못될 가능성이 있다.

데이터베이스 관리 시스템에서 트랜잭션은 논리적 또는 작업의 단일 단위이며, 때로는 여러 작업으로 구성된다. 데이터베이스에서 일관된 모드로 수행되는 모든 논리적 계산은 트랜잭션으로 알려져 있다. 한 가지 예로 한 은행 계좌에서 다른 계좌로의 이체가 있다. 완전한 트랜잭션은 한 계좌에서 이체할 금액을 차감하고 다른 계좌에 동일한 금액을 추가하는 것을 필요로 한다.

데이터베이스 트랜잭션은 정의상 원자성(전체적으로 완료되거나 전혀 효과가 없어야 함), 일관성(데이터베이스의 기존 제약 조건을 준수해야 함), 격리성(다른 트랜잭션에 영향을 미치지 않아야 함), 그리고 지속성(비휘발성 저장소에 기록되어야 함)을 가져야 한다. 데이터베이스 실무자들은 종종 ACID라는 약어를 사용하여 데이터베이스 트랜잭션의 이러한 속성을 지칭한다.

## 목적
데이터베이스 및 데이터의 무결성을 최우선으로 취급하는 기타 데이터 저장소는 무결성 유지를 위해 트랜잭션을 처리하는 기능을 포함하는 경우가 많다. 단일 트랜잭션은 하나 이상의 독립적인 작업 단위로 구성되며, 각 단위는 데이터베이스 또는 기타 데이터 저장소에서 정보를 읽거나 쓴다. 이런 일이 발생할 때, 모든 처리가 데이터베이스나 데이터 저장소를 일관된 상태로 유지하도록 보장하는 것이 중요하다.

복식부기 회계 시스템의 예는 종종 트랜잭션의 개념을 잘 설명해 준다. 복식부기에서 모든 차변(debit)은 연관된 대변(credit)의 기록을 요구한다. 식료품을 사기 위해 100달러짜리 수표를 쓴다면, 트랜잭션 기반의 복식부기 회계 시스템은 단일 트랜잭션을 처리하기 위해 다음 두 가지 항목을 기록해야 한다:

# 식료품 비용 계정에 100달러 차변 기록
# 당좌 예금 계정에 100달러 대변 기록

트랜잭션 시스템은 두 항목을 모두 통과시키거나 두 항목 모두 실패하게 만든다. 여러 항목의 기록을 원자적인 트랜잭션 작업 단위로 취급함으로써 시스템은 기록된 데이터의 무결성을 유지한다. 즉, 차변은 기록되었으나 연관된 대변이 기록되지 않거나 그 반대의 상황이 발생하는 일이 없게 된다.

## 트랜잭션 데이터베이스
**트랜잭션 데이터베이스**는 대괄호로 묶인 데이터베이스 작업 세트(begin-commit)에 대해 ACID 속성을 제공하는 DBMS이다. 트랜잭션은 동시 업데이트 및 장애가 발생하더라도 데이터베이스가 항상 일관된 상태에 있음을 보장한다. 트랜잭션 내의 모든 쓰기 작업은 '전부 아니면 전무(all-or-nothing)'의 효과를 가지며, 즉 트랜잭션이 성공하여 모든 쓰기가 적용되거나, 그렇지 않으면 데이터베이스가 해당 트랜잭션의 어떤 쓰기도 포함하지 않는 상태로 되돌아간다. 또한 트랜잭션은 동시 트랜잭션의 효과가 격리 수준이라고 알려진 특정 보증을 충족하도록 보장한다. 가장 높은 격리 수준은 직렬화 가능성으로, 이는 동시 트랜잭션의 효과가 트랜잭션들을 직렬(즉, 순차적)로 실행한 것과 동일함을 보장한다.

2008년 현재 대부분의 현대적인 관계형 데이터베이스 관리 시스템은 트랜잭션을 지원한다. NoSQL 데이터베이스는 동시 업데이트 및 액세스 시 데이터 일관성을 보장하기 위해 트랜잭션 지원과 함께 확장성을 우선시한다.

데이터베이스 시스템에서 트랜잭션은 하나 이상의 데이터 조작 문구와 질의로 구성될 수 있으며, 각 문구는 데이터베이스의 정보를 읽거나 쓴다. 데이터베이스 시스템 사용자는 데이터의 일관성과 무결성을 매우 중요하게 생각한다. 단순한 트랜잭션은 일반적으로 다음과 같은 패턴을 사용하여 SQL과 같은 언어로 데이터베이스 시스템에 발행된다:

# 트랜잭션을 시작한다.
# 데이터 조작 및 질의 세트를 실행한다.
# 오류가 발생하지 않으면 트랜잭션을 커밋(commit)한다.
# 오류가 발생하면 트랜잭션을 롤백(rollback)한다.

트랜잭션 커밋 작업은 트랜잭션 범위 내의 모든 데이터 조작 결과를 데이터베이스에 영구적으로 반영한다. 트랜잭션 롤백 작업은 트랜잭션 범위 내의 부분적인 데이터 조작 결과를 데이터베이스에 반영하지 않는다. 부분적인 트랜잭션이 데이터베이스에 커밋될 수 있는 경우는 없는데, 이는 데이터베이스를 일관되지 않은 상태로 만들 수 있기 때문이다.

내부적으로 다중 사용자 데이터베이스는 종종 트랜잭션 ID 또는 XID를 사용하여 트랜잭션을 저장하고 처리한다.

위에서 설명한 간단한 방식 외에도 트랜잭션을 구현하는 다양한 방식이 존재한다. 예를 들어, 중첩 트랜잭션은 내부에 새로운 트랜잭션(즉, 하위 트랜잭션)을 시작하는 문구를 포함하는 트랜잭션이다. 다단계 트랜잭션은 하위 트랜잭션이 계층화된 시스템 아키텍처의 서로 다른 수준에서 발생하는 중첩 트랜잭션의 변형이다(예: 하나는 데이터베이스 엔진 수준에서, 하나는 운영 체제 수준에서 작업 수행). 또 다른 유형의 트랜잭션으로는 보상 트랜잭션이 있다.

### SQL에서
트랜잭션은 대부분의 SQL 데이터베이스 구현에서 사용 가능하지만, 견고함의 수준은 다양하다. 예를 들어, MySQL은 초기 버전 3.23부터 트랜잭션을 지원하기 시작했으나, InnoDB 스토리지 엔진은 버전 5.5 이전까지 기본값이 아니었다. 이전에 사용 가능했던 스토리지 엔진인 MyISAM은 트랜잭션을 지원하지 않는다.

트랜잭션은 일반적으로 `BEGIN` 명령을 사용하여 시작된다(비록 SQL 표준은 `START TRANSACTION`을 규정하고 있지만). 시스템이 `[[커밋 (SQL)|COMMIT]]` 문을 처리하면 트랜잭션은 성공적으로 완료되며 종료된다. `[[롤백 (데이터 관리)|ROLLBACK]]` 문 또한 트랜잭션을 종료할 수 있으며, `BEGIN` 이후 수행된 모든 작업을 취소한다. 트랜잭션 시작과 함께 자동 커밋이 비활성화되었다면, 트랜잭션 종료와 함께 자동 커밋이 다시 활성화된다.

전역적으로는 물론 개별 트랜잭션 작업에 대해 격리 수준을 설정할 수 있다. 가장 높은 수준(`READ COMMITTED`)에서는 트랜잭션이 시작된 후 수행된 모든 작업의 결과가 트랜잭션이 종료될 때까지 다른 데이터베이스 사용자에게 보이지 않는다. 때때로 높은 동시성을 보장하기 위해 사용되는 가장 낮은 수준(`READ UNCOMMITTED`)에서는 이러한 변경 사항이 즉시 표시된다.

## 객체 지향 데이터베이스
관계형 데이터베이스는 전통적으로 고정된 크기의 필드와 레코드를 가진 테이블로 구성된다. 객체 지향 데이터베이스는 가변 크기의 blob으로 구성되며, 이는 직렬화 가능하거나 mime-type을 포함할 수 있다. 관계형 데이터베이스와 객체 데이터베이스 사이의 근본적인 유사점은 시작과 커밋 또는 롤백이다.

트랜잭션을 시작한 후, 데이터베이스 레코드나 객체는 읽기 전용 또는 읽기-쓰기 방식으로 잠긴다(locked). 그 후 읽기와 쓰기가 발생할 수 있다. 트랜잭션이 완전히 정의되면, 변경 사항은 원자적으로 커밋되거나 롤백되어 트랜잭션 종료 시에 일관성 결여가 발생하지 않도록 한다.

## 분산 트랜잭션
데이터베이스 시스템은 여러 노드에 걸쳐 데이터에 접근하는 트랜잭션으로 분산 트랜잭션을 구현한다. 분산 트랜잭션은 여러 노드에 대해 ACID 속성을 강제하며, 데이터베이스, 저장소 관리자, 파일 시스템, 메시징 시스템 및 기타 데이터 관리자와 같은 시스템을 포함할 수 있다. 분산 트랜잭션에는 일반적으로 트랜잭션의 모든 부분이 모든 관련 시스템에 적용되도록 보장하기 위해 전체 프로세스를 조정하는 엔티티가 존재한다. 더욱이, 이러한 환경 내에서 서비스형 스토리지(StaaS)의 통합은 매우 중요한데, 이는 가용성, 확장성 및 ACID 속성이 다양한 다양한 클라우드 기반 데이터 저장소 클래스를 수용하며 사실상 무한한 저장소 리소스 풀을 제공하기 때문이다. 이러한 통합은 클라우드 기반 데이터 저장소에 배포된 데이터 집약적 애플리케이션에서 더 높은 가용성, 낮은 응답 시간 및 비용 효율성을 달성하는 데 필수적이다.

## 트랜잭션 파일 시스템
리눅스용 Namesys Reiser4 파일 시스템은 트랜잭션을 지원하며, 마이크로소프트 윈도우 비스타부터 마이크로소프트 NTFS 파일 시스템은 네트워크 전반의 분산 트랜잭션을 지원한다. 워프 트랜잭션 파일 시스템(Warp Transactional Filesystem, WTF)과 같이 더욱 데이터 일관성이 높은 파일 시스템에 대한 연구가 진행되고 있다.

## 같이 보기
* 트랜잭션

## 각주

분류:데이터 관리
분류:데이터베이스 관리 시스템