−데이터베이스에서는 여러 문장으로 표현된 작업도 하나의 트랜잭션에 들어갈 수 있다. 작업이 성공해 결과를 확정하는 동작이 커밋(commit)이고, 진행 중인 변경을 취소하는 동작이 롤백(rollback)이다. 사용자에게 보이는 주문 한 건이 DB 트랜잭션 하나와 정확히 일치하는지는 애플리케이션의 경계 설정에 달려 있다.
묶어서 확정하는 성질만으로는 동시 실행까지 설명할 수 없다. 같은 좌석을 두 사람이 동시에 예약하거나, 서로 다른 행을 바꾸는 두 작업이 함께 하나의 규칙을 어기는 문제도 있다. 트랜잭션은 복구할 작업 단위와 함께, 여러 작업이 겹칠 때 어떤 실행을 허용할지도 다루며 이 둘은 원자성과 격리성이라는 다른 질문으로 나뉜다.
이 문서는 트랜잭션을 특정 DB의 BEGIN 문법에서 출발한 기능으로 보지 않고, 장애를 견디는 데이터 처리의 단위를 어떻게 정의해 왔는지부터 살펴본다. SQL 격리 수준과 MVCC는 그 개념을 구현하고 조정하는 과정에서 만나는 용어다.
공유 데이터의 일관성을 실행 순서와 연결하다 (1976)
여러 사용자가 같은 데이터를 다루면 개별 작업의 올바름과 전체 실행의 올바름이 갈라진다. 재고를 읽고 줄이는 절차를 따로 보면 맞아도, 두 작업이 읽기와 쓰기 사이에 끼어들면 결과가 달라진다. 트랜잭션의 역사는 복구할 단위와 함께 실행 순서를 정의하는 문제를 포함한다.
Eswaran·Gray·Lorie·Traiger의 1976년 논문은 트랜잭션·일관성·스케줄과 잠금의 관계를 형식화했다. 어떤 잠금 규칙 아래 여러 작업을 섞어 실행해도 직렬 실행과 동등한 결과를 얻는지 분석하고, 물리적인 레코드뿐 아니라 조건으로 지정한 데이터 집합을 보호하는 문제를 다뤘다.[각주 1]
이 기록에서 트랜잭션은 SQL 명령 하나의 이름보다 넓은 작업 단위다. 이후의 복구와 격리 논의도 무엇을 한 작업으로 보고 어떤 실행을 허용할 것인가라는 두 질문을 이어받는다.
상태 변환과 복구 범위를 정리하다 (1981)
Jim Gray의 「The Transaction Concept: Virtues and Limitations」는 1981년 트랜잭션을 원자성·일관성·내구성을 가진 상태 변환으로 설명했다. 이미 발전하던 개념과 구현을 정리하면서, 하위 트랜잭션과 오래 지속되는 작업처럼 남아 있는 문제도 논의했다.[각주 2]
논문은 보호되는 데이터 동작과 외부 세계의 동작을 구별한다. DB 변경을 되돌리는 것과 이미 배출한 현금을 되찾는 것은 다른 종류의 일이다. 이 구분은 훗날 원격 서비스의 호출이나 메시지 전달을 로컬 롤백과 어떻게 연결할 것인지 이해하는 데도 쓰인다.
복구 시스템은 어떤 변경이 같은 작업에 속하고 무엇이 이미 확정됐는지 알아야 한다. 작업 경계와 커밋 기록이 단순한 제어 문법을 넘어 복구 판단의 근거가 되는 이유다.
복구 기법을 비교하는 언어로 묶인 ACID (1983)
Theo Härder와 Andreas Reuter의 1983년 논문은 복구 기법들을 같은 개념으로 비교하기 위한 틀을 제시하고, 원자성·일관성·격리성·내구성을 ACID로 묶어 설명했다.[각주 3]
+데이터베이스에서는 여러 문장으로 표현된 작업도 하나의 트랜잭션에 들어갈 수 있다. 작업이 성공해 결과를 확정하는 동작이 커밋(commit)이고, 진행 중인 변경을 취소하는 동작이 롤백(rollback)이다. 사용자에게 보이는 주문 한 건이 DB 트랜잭션 하나와 정확히 겹치는지는 애플리케이션이 경계를 어디에 두는지에 달려 있다.
묶어서 확정하는 성질만으로는 동시 실행을 설명하지 못한다. 두 사람이 같은 좌석을 동시에 예약하는 경우도 있고, 서로 다른 행을 바꾼 두 작업이 합쳐져 규칙 하나를 어기는 경우도 있다. 그래서 트랜잭션은 무엇을 한 번에 복구할지와 함께, 여러 작업이 겹칠 때 어떤 실행을 허용할지도 다룬다. 앞의 질문은 원자성, 뒤의 질문은 격리성으로 갈린다.
이 문서는 트랜잭션을 특정 DB의 BEGIN 문법보다는 장애를 견디는 데이터 처리 단위를 어떻게 정의할지의 문제로 다룬다. SQL 격리 수준과 MVCC는 그 개념을 구현하고 조정하는 과정에서 만나는 용어다.
연혁
1976년: K. P. Eswaran, J. N. Gray, R. A. Lorie, I. L. Traiger가 「The Notions of Consistency and Predicate Locks in a Database System」에서 트랜잭션·일관성·스케줄과 잠금의 관계를 형식화했다.[각주 1]
1981년: Jim Gray가 「The Transaction Concept: Virtues and Limitations」에서 트랜잭션을 원자성·일관성·내구성을 가진 상태 변환으로 설명했다. 이미 발전하던 개념과 구현을 정리하면서 하위 트랜잭션, 오래 지속되는 작업처럼 남은 문제도 함께 논의했다.[각주 2]
1983년: Theo Härder와 Andreas Reuter가 「Principles of Transaction-Oriented Database Recovery」에서 복구 기법을 같은 개념으로 비교하는 틀을 제시하고, 원자성·일관성·격리성·내구성을 ACID로 묶어 설명했다.[각주 3]
1995년: Hal Berenson 등이 「A Critique of ANSI SQL Isolation Levels」에서 당시 SQL 격리 수준 정의의 모호함과 빠진 경우를 분석하고 스냅샷 격리를 다뤘다.[각주 4]
2012년: Dan R. K. Ports와 Kevin Grittner가 「Serializable Snapshot Isolation in PostgreSQL」에서 PostgreSQL 9.1의 Serializable Snapshot Isolation(SSI) 구현 경험을 발표했다. 이 연도는 논문 발표 시점이다.[각주 5]
공유 데이터와 직렬가능성 (1976)
여러 사용자가 같은 데이터를 다루면 작업 하나하나의 올바름과 전체 실행의 올바름이 갈라진다. 재고를 읽고 줄이는 절차는 따로 떼어 보면 맞아도, 두 작업이 서로의 읽기와 쓰기 사이에 끼어들면 결과가 달라진다.
Eswaran·Gray·Lorie·Traiger의 1976년 논문은 공유 데이터의 일관성과 실행 순서를 한 문제로 묶어, 어떤 잠금 규칙 아래에서 여러 작업을 섞어 실행해도 직렬 실행과 같은 결과를 얻는지 분석했다. 물리적인 레코드뿐 아니라 조건으로 지정한 데이터 집합을 보호하는 문제도 다뤘다.[각주 1] 이 논문에서 트랜잭션은 SQL 명령 하나의 이름보다 넓은 작업 단위이고, 뒤이은 복구와 격리 논의도 무엇을 한 작업으로 보고 어떤 실행을 허용할지라는 두 질문을 이어받는다.
직렬가능성은 성공한 작업들의 효과가 어떤 직렬 순서로 실행한 결과와 같아야 한다는 요구다. 실제 구현은 작업을 겹쳐 실행하면서, 충돌하는 작업을 기다리게 하거나 중단시켜 이 요구를 맞출 수 있다.
상태 변환과 복구 범위 (1981)
Jim Gray의 1981년 논문은 동작을 비보호(unprotected)·보호(protected)·실제(real) 동작의 세 부류로 나눠 복구 범위를 구분한다. 비보호 동작은 트랜잭션이 중단돼도 되돌리거나 다시 실행할 필요가 없고, DB 변경 같은 보호 동작은 되돌리거나 다시 실행할 수 있어야 한다. 현금 배출 같은 실제 동작은 한 번 일어나면 되돌릴 수 없으므로 커밋할 때까지 미룬다.[각주 2] 이 구분은 훗날 원격 서비스 호출이나 메시지 전달을 로컬 롤백과 어떻게 연결할지 이해하는 데도 쓰인다.
복구 시스템은 어떤 변경이 같은 작업에 속하고 무엇이 이미 확정됐는지 알아야 한다. 작업 경계와 커밋 기록이 제어 문법이면서 동시에 복구 판단의 근거가 되는 이유다.
ACID와 복구 기법의 공통 언어 (1983)