개요
데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.
이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫글자를 따 ACID라 부른다. 그러나, 실제로는 성능향상을 위해 이런 특성들이 종종 완화되곤 한다.
어떤 시스템들에서는 트랜잭션들은 논리적 작업 단위(LUW, Logical Units of Work)로 불린다.
구현
데이터베이스 기능 중, 트랜잭션을 조작하는 기능은 사용자가 데이터베이스 완전성(integrity) 유지를 확신하게 한다.
단일 트랜잭션은 데이터베이스 내에 읽거나 쓰는 여러 개 쿼리를 요구한다 이때 중요한 것은 데이터베이스가 수행된 일부 쿼리가 남지 않는 것이다. 예를 들면, 송금을 할 때 한 계좌에서 인출되면 다른 계좌에서 입금이 확인되는 것이 중요하다. 또한 트랜잭션은 서로 간섭하지 않아야 한다. 트랜잭션의 특성에 대해 더 많은 정보를 보려면, ACID를 참조.
간단한 트랜잭션은 아래 양식의 SQL 언어로 데이터베이스 내에서 실행된다.
- Begin the transaction
- Execute several queries (DB내 갱신이 아직 적용되지 않는다)
- Commit the transaction (트랜잭션이 성공적이며, 갱신이 실제 적용됨)
만약 쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 롤백한다. 이것은 DBMS가 어떻게 사용되고 셋업 되었느냐에 따라 다르다. 트랜잭션은 커밋전에 언제든지 수동으로 롤백될 수 있다.
트랜잭셔널 데이터베이스 트랜잭션을 지원하는 데이터베이스를 트랜잭셔널 데이터베이스(transactional database)라고 부른다. 현재 대부분의 관계형 데이터베이스 관리시스템은 트랜잭션 데이터베이스이다. 트랜잭셔널 파일시스템 리눅스의 Namesys Reiser4 파일시스템과 마이크로소프트 NTFS 새로운 버전은 모두 트랜잭션을 지원한다.
Isolation Level
- Read-uncommitted: dirty read allowed
- Read-committed: dirty read unallowed
- Repeatable-read: in the same query, the same result, allow phantom tuples
- Serializable: Do no allow anything
Lost update
Lost update이란 하나의 transcation이 다른 transcation에 영향을 주어서, 두 작업중 하나가 실패하게 되는 상황을 말한다.
Dirty read
한 트랜잭션(T1)이 데이타에 접근하여 값을 'A'에서 'B'로 변경했고 아직 커밋을 하지 않았을때, 다른 트랜잭션(T2)이 해당 데이타를 Read 하게 되면 T2가 읽은 데이타는 B가 될 것이다. 하지만 T1이 최종 커밋을 하지 않고 종료된다면, T2가 가진 데이타는 꼬이게 된다. 따라서 commit되기 전에는 그 영역에 lock을 걸어야 한다.
Repeatable-read
하나의 trasaction이 삭제 작업이 끝나기 전에 그 영역에 접근을 한다면, 그 접근은 다시 시도하였을 경우 허용되지 않을 것이다. 즉 이처럼 하나의 transaction read에 대한 접근은 반드시 다른 transaction에 lock을 거는 조건을 말한다.
Phantom tuples
트랜잭션(T1) 중에 특정 조건으로 데이타를 검색하여 결과를 얻었다. 이때 다른 트랜잭션(T2)가 접근해 해당 조건의 데이타 일부를 삭제 또는 추가 했을때, 아직 끝나지 않은 T1이 다시 한번 해당 조건으로 데이타를 조회 하면 T2에서 추가/삭제된 데이타가 함께 조회/누락 된다. 만약 이 상황에서 T2가 transaction을 roll-back하면 T1은 T2가 롤백한 데이터를 알지 못하여 마치 T2가 데이터를 commit 한 것처럼 행동하게 된다.