트랜잭션(Transaction)
논리 작업 단위를 형성하는 모음을 Transaction이라 한다.
트랜잭션은 Data를 일관성 있게 변경하는 DML(Data Manipulation Language) 문, 하나의 DDL(Data Definition Language) 문, 하나의 DCL(Data Control Language) 문 중 하나로 구성된다.
트랜잭션은 실행 가능한 첫 번째 SQL문이 실행되면 시작된다.
COMMIT 또는 ROLLBACK 실행 시 종료되고, DDL 또는 DCL 문 실행 시 자동으로 Commit 되므로 이때도 종료된다. 또한 사용자 종료 또는 시스템에 의한 비정상적인 종료 시에도 종료된다.
특징
원자성(Atomicity) : Data 처리의 최소 단위
일관성(Consistency) : Data 입출력에 일관적(논리적)임
격리성(Isolation) : Transaction이 진행되고 있는 Data는 다른 Transaction이 접근할 수 없음
내구성(Durability) : Transaction이 완료된 Data는 복구될 수 없음 (Flashback : 9i부터 지원되는 복구 기능)
암시적 처리
자동으로 COMMIT이 발생되는 경우
1. DDL 문이 실행된 경우
2. DCL 문이 실행된 경우
3. 명시적으로 COMMIT 또는 ROOBACK이 실행되지 않은 채 SQL*Plus에서 정상 종료한 경우
자동 ROLLBACK이 발생되는 경우
1. SQL*Plus가 비정상 종료된 경우
2. 시스템 장애에 의해 비정상 종료된 경우
제어
COMMIT : 보류 중인 Data 변경 사항을 DV에 저장하고 현재 트랜잭션을 종료한다.
SAVEPOINT name : 현재 트랜잭션 내에 저장점(name)을 표시한다. (ANSI 표준 SQL은 아니다.)
ROLLBACK [to SAVEPOINT name] : 보류 중인 Data 변경 사항을 취소하고 현재 트랜잭션을 종료한다. 만약 SAVEPOINT를 지정하면 트랜잭션 내에서 지정된 SAVEPOINT까지만 Rollback 한다.
UPDATE employee SET id = 10001 WHERE employee id = 10; /* 1행 갱신 */
SAVEPOINT update_done; /* 저장점 생성 */
DELETE FROM employee where id = 10001; /* 1행 삭제 */
ROLLBACK to update_done; /* update_done까지 롤백 */
위와 같이 세이브포인트를 지정하고, ROLLBACK TO를 사용해 해당 세이브 지점까지만 ROLLBACK 하면 DELETE 문 전까지 ROLLBACK 될 것이다.
따라서 id 값은 10001로 수정된 상태로 존재할 것이다.
Data 상태
Transaction 중
- Data를 이전 상태로 복구할 수 있다.
- 현재 사용자는 SELECT 문을 사용하여 DML 작업 결과를 확인할 수 있다.
- 현재 사용 중인 DML 문의 결과를 다른 사용자는 볼 수 없다.
- 트랜잭션 관련 행들이 잠겨있어서 다른 사용자들은 관련 행들의 Data를 변경할 수 없다.
COMMIT 실행 후
- Data 변경 내용이 데이터베이스에 영구적으로 저장된다.
- Data의 COMMIT 이전 상태는 완전히 없어진다.
- 모든 사용자가 결과를 볼 수 있다.
- 트랜잭션 관련 행들의 잠금이 해제되어 다른 사용자들이 행을 조작할 수 있다.
- 모든 SAVEPOINT가 지워진다.
ROLLBACK 실행 후
- Data 변경이 취소된다.
- Data가 이전 상태로 복구된다.
- 트랜잭션 관련 행에 대한 잠금이 해제된다.
읽기 일관성(Consistency)
일관성 있는 Data View를 보장하므로 한 사용자가 변경한 내용이 다른 사용자가 변경한 내용과 충돌하지 않는다.
동일한 Data에 대해서 다음을 보장한다.
1. Data를 읽는 중에는 쓸 수 없음
2. Data를 쓰는 중에는 읽을 수 없음
잠금(Locking)
동시에 수행되는 트랜잭션 간의 파괴적인 상호 작용을 방지하는 것으로 사용자 작업이 필요 없으며 자동적으로 최저 제한성 레벨을 사용한다.
트랜잭션 시행 중에 유지되고, 배타적 모드와 공유 모드가 존재한다.
배타적(Exclusive) 모드
자원 공유를 방지한다.
자원을 배타적으로 잠그는 첫 번째 트랜잭션만 배타적 잠금이 해제될 때까지 자원을 변경할 수 있다.
공유(Share) 모드
자원 공유를 허용한다.
Data를 읽는 다중 사용자가 Data를 공유할 수 있으며 공유 잠금을 유지하여 배타적 잠금이 필요한 기록자가 동시에 액세스 하는 것을 방지할 수 있다.
여러 트랜잭션에서 동일한 자원에 대해 공유 잠금을 적용할 수 있다.