|
|
| 1번째 줄: |
1번째 줄: |
| [[분류:데이터베이스]] | | 상위 문서: [[SQL]] |
|
| |
|
| == 개요 == | | ==개요== |
| 데이터베이스 트랜잭션(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 한 것처럼 행동하게 된다.
| |