공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
예제는 Oracle Database에서 기본으로 제공되는 SCOTT계정 데이터로 진행됩니다.
트랜잭션(transaction)
트랜잭션은 더 이상 분할할 수 없는 최소 수행 단위를 의미한다. 하나의 작업, 또는 밀접하게 연관된 작업을 수행하기 위해 한 개 이상의 DML (데이터 조작 명령어)로 이뤄진다. 트랜잭션은 하나의 트랜잭션 내에 있는 여러 명령어를 한 번에 수행하여 작업을 완료하거나 아예 수행하지 않는 상태(모든 작업을 취소)밖에 없다. 그래서 'ALL OR NOTHING'이라는 문장으로 설명하기도 한다. 트랜잭션을 제어하기 위해 사용하는 명령어를 TCL (transaction Control Language)이라고 한다.
트랜잭션은 SCOTT 같은 데이터베이스 계정을 통해 접속하는 동시에 시작된다. 트랜잭션이 종료되기 전까지 여러 SQL문을 실행하고 TCL 이나 DDL (Data Definition Language), DCL (Data Control Language)명령어를 사용할 때 기존 트랜잭션이 끝나고 새 트랜잭션이 시작된다.
ex) 계좌이체
예를 들어 A 계좌에 있는 100만 원을 B의 계좌로 이체한다고 했을 때, A 계좌에서 100만 원을 빼는 과정(A 계좌 UPDATE )과 B계좌에 100만 원을 더하는 과정(B계좌 UPDATE )은 모두 한 번에 이뤄져야 한다. 앞의 두 과정은 절대 따로 해서는 안 되는 안되기 때문에 꼭 한 번에 다 실행되거나 실행이 불가능할 경우 둘 다 실행되지 말아야 한다. 이럴 때 이 UPDATE 문 두 문장을 묶어 하나의 트랜잭션이라고 한다.
TCL(Transaction Control Language)
하나의 트랜잭션에 묶여 있는 DML(데이터 조작어)의 수행 상태는 모든 명령어가 정상적으로 수행 완료된 상태 또는 모든 명령어가 수행되지 않아 취소된 상태 두 가지로만 존재할 수 있다. TCL(트랜잭션 제어 명령어)은 데이터 조작 상태를 이 두 가지 상태 중 하나로 유도하는 명령어를 의미한다. 즉 데이터 조작을 데이터베이스에 영구히 반영하거나 작업 전체를 취소한다.
TCL 명령어
- ROLLBACK : 현재 트랜잭션에 포함된 DML관련 명령어의 수행 취소
- COMMIT : 현재까지 수행했던 트랜잭션 명령어를 데이터베이스에 영구히 반영
COMMIT, ROLLBACK명령어 모두 현재 트랜잭션을 끝내고 새 트랜잭션을 시작하게 한다.
종료될 트랜잭션의 작업을 반영할지 말지만 결정하는 것 !
1. ROLLBACK
ROLLBACK;
ROLLBACK 은 현재 트랜잭션에 포함된 데이터 조작 관련 명령어들의 수행을 모두 취소한다.
2. COMMIT
COMMIT;
COMMIT 은 지금까지 트랜잭션에서 데이터 조작 관련 명령어를 통해 변경된 데이터를 모두 데이터베이스에 영구히 반영한다.
COMMIT 명령어를 사용하면 취소가 불가능하기 때문에 트랜잭션 작업이 정상적으로 수행되었다고 확신할 때만 사용해야 한다.
세션(session)
오라클 데이터베이스에서 세션은 데이터베이스 접속을 시작으로 여러 데이터베이스에서 관련 작업을 수행한 후 접속을 종료하기까지 전체 기간을 의미한다. 만약 세션이 여러 개라면 현재 오라클 데이터베이스에 접속하여 사용 중인 연결이 여러 개 있다는 의미이다.
■ 세션과 트랜잭션의 관계
트랜잭션 : DML (데이터 조작 명령어)이 모인 하나의 작업 단위
세션 : 데이터베이스에 접속 시점부터 접속 종료까지의 기간
세션 내부에는 하나 이상의 트랜잭션이 존재한다. (데이터베이스에 접속하면 트랜잭션이 시작되기 때문)
■ 읽기 일관성(read consistency)
어떤 데이터 조작이 포함된 트랜잭션이 완료( COMMIT , ROLLBACK )되기 전까지 데이터를 직접 조작하는 세션 외 다른 세션에서는 데이터 조작 전 상태의 내용이 일관적으로 조회 · 출력 · 검색되는 특성을 의미한다.
→ 어떤 특정 세션에서 테이블의 데이터를 변경 중일 때 그 외 다른 세션에서는 데이터의 변경이 확정되기 전까지 변경사항을 알 필요가 없으므로, 데이터를 변경 중인 세션을 제외한 나머지 세션에서는 현재 진행 중인 변경과 무관한 본래의 데이터를 보여주는 것
데이터베이스 입장에서는 데이터를 변경하는 DML (데이터 조작 명령어)을 실행한 후 COMMIT 으로 데이터베이스에 반영할지 ROLLBACK 으로 실행을 취소할지 알 수 없다. 그래서 ROLLBACK 으로 명령어 수행이 취소될 경우를 대비해 변경 전 데이터를 undo segment에 따로 저장해둔다.
LOCK
LOCK은 하나의 데이터를 여러 곳에서 동시에 조작하려 할 때 발생할 수 있는 혼란을 최소화하기 위한 요소로, 조작 중인 데이터를 다른 세션들이 조작할 수 없도록 접근을 보류시키는 것을 의미한다. 데이터에 LOCK이 걸린 경우 COMMIT 이나 ROLLBACK 을 실행해야만 해당 데이터의 LOCK이 풀린다.
HANG : 특정 세션에서 데이터 조작이 완료될 때까지 다른 세션에서 해당 데이터 조작을 기다리는 현상
■ LOCK의 종류
SQL문으로 조작하는 대상 데이터가 테이블의 특정 행 데이터일 경우 해당 행만 LOCK이 발생한다는 의미로 행 레벨 록 (row level lock)이라고 정의한다. WHERE 절을 지정하지 않은 UPDATE , DELETE 문일 경우에는 테이블의 모든 행 데이터에 영향을 주는 명령어 이므로 이 경우에는 테이블에 저장되어 있는 전체 행이 LOCK상태가 된다. 다른 세션에서는 해당 테이블에 이미 저장되어 있는 행에 UPDATE , DELETE 명령을 수행하기 위해서 대기해야 하지만 테이블 전체 행이 LOCK 상태여도 INSERT 문은 수행은 가능하다. 하지만 변경되는 행의 수와는 관계없이 DML (데이터 조작어)을 사용하여 데이터가 변경되는 테이블은 테이블 단위 잠금이라는 의미로 테이블 레벨 록(table level lock)이 걸린다. 즉 데이터를 변경 중인 세션 외 다른 세션에서 DDL (데이터 정의어)을 통한 테이블의 구조를 변경할 수는 없다.
→ DML (데이터 조작어) 관련 SQL문을 어떤 방식으로 작성하느냐에 따라 테이블의 일부 데이터만 LOCK이 될 수 있고, 테이블 전체 데이터가 LOCK이 될 수 있다.
'Back end > Database' 카테고리의 다른 글
[Oracle] 객체 종류 (0) | 2019.09.30 |
---|---|
[Oracle] 데이터 정의어 (DDL : Data Definition Language) (0) | 2019.09.29 |
[Oracle] 데이터 조작어 (DML : Data Manipulation Language) (0) | 2019.09.18 |
[Oracle] 서브쿼리(Subquery) (1) | 2019.09.17 |
[Oracle] 조인(join) + SQL-99 표준 문법 (0) | 2019.09.09 |