어떤 상황에서든 두 UPDATE문을 모두 완전히 실행하는 것
완전히 실행하는 것이 불가능 하다면, 두 UPDATE문을 실행하기 전의 상태,
즉 아무 UPDATE문도 실행하지 않는 상태를 유지할 수 있어야 한다.
- 트랜잭션 제어 명령어는 데이터 조작 상태를 이 두 가지 상태 중 하나로 유도하는 명령어를 의미한다.
CREATE TABLE DEPT_TCL
AS SELECT * FROM DEPT;
INSERT INTO DEPT_TCL VALUES(50, 'DATABASE', 'SEOUL');
UPDATE DEPT_TCL SET LOC = 'BUSAN' WHERE DEPTNO = 40;
DELETE FROM DEPT_TCL WHERE DNAME = 'RESEARCH';
SELECT * FROM DEPT_TCL;
ROLLBACK;
- ROLLBACK과 달리 지금까지 수행한 트랜잭션 명령어를 데이터베이스에 영구히 반영할 때는 COMMIT 명령어를 사용한다.
INSERT INTO DEPT_TCL VALUES(50, 'NETWORK', 'SEOUL');
UPDATE DEPT_TCL SET LOC = 'BUSAN' WHERE DEPTNO = 20;
DELETE FROM DEPT_TCL WHERE DEPTNO=40;
SELECT * FROM DEPT_TCL;
COMMIT;
- COMMIT 명령어는 지금까지 트랜잭션에서 데이터 조작 관련 명령어를 통해 변경된 데이터를 모두 데이터베이스에 영구히 반영한다.
- COMMIT, ROLLBACK 명령어 모두 현재 트랜잭션을 끝내고 새 트랜잭션을 시작하게 한다.
→ 종료될 트랜잭션에 작업을 반영할지 취소할지 결정한다.
출처: https://memory0136.tistory.com/36
- 오라클 데이터베이스에서의 세션:
데이터베이스 접속을 시작으로 여러 데이터 베이스에서 관련 작업을 수행한 후 접속을 종료하기 까지의 전체 기간
- 즉, 세션이 여러 개라는 말은, 현재 오라클 데이터 베이스에 접속하여 사용 중인 연결이 여러 개 있다는 뜻이다.
- 읽기 일관성?
어떤 특정 세션에서 테이블의 데이터를 변경 중일 때, 그 외 다른 세션에서는 데이터의 변경이 확정되기 전까지 변경 사항을 알 필요가 없으므로, 데이터를 변경 중인 세션을 제외한 나머지 세션에서는 현재 진행 중인 변경과 무관한 본래의 데이터를 보여 주는 특성을 의미한다.
-- 세션 A
SELECT * FROM DEPT_TCL;
-- 세션 B
SELECT * FROM DEPT_TCL;
-- 세션 A
DELETE FROM DEPT_TCL WHERE DEPTNO=50;
SELECT * FROM DEPT_TCL;
-- 세션 B
--세션 A의 DELETE 명령 후,
SELECT * FROM DEPT_TCL;
- 어떤 데이터 조작이 포함된 트랜잭션이 완료(COMMIT, ROLLBACK)되기 전까지 데이터를 직접 조작하는 세션 외, 다른 세션에서는 데이터 시작 전 상태의 내용이 일관적으로 조회, 출력, 검색되는 특성을 읽기 일관성(READ CONSISTENCY)라고 한다.
-- 세션 A
COMMIT;
SELECT * FROM DEPT_TCL;
-- 세션 B
--세션 A의 COMMIT 명령 후,
SELECT * FROM DEPT_TCL;
- LOCK은 조작 중인 데이터를 다른 세션은 조작할 수 없도록 접근을 보류시키는 것을 뜻한다.
-- 세션 A
SELECT * FROM DEPT_TCL;
-- 세션 B
SELECT * FROM DEPT_TCL;
-- 세션 A
UPDATE DEPT_TCL SET LOC = 'SEOUL'
WHERE DEPTNO = 30;
-- 세션 B
-- 세션 A의 UPDATE명령이 끝날 때까지 기다리기
SELECT * FROM DEPT_TCL;
-- 세션 A
작업X
-- 세션 B
UPDATE DEPT_TCL SET DNAME = 'DATABASE'
WHERE DEPTNO = 30;
- 이렇게 특정 세션에서 데이터 조작이 완료될 때까지 다른 세션에서 해당 데이터 조작을 기다리는 현상을 HANG(행)이라고 한다.
-- 세션 A
COMMIT;
-- 세션 B
세션 A의 COMMIT 명령어가 실행되는 순간의 변화 확인 후 UPDATE문 실행
-- 세션 A
SELECT * FROM DEPT;
-- 세션 B
SELECT * FROM DEPT;
-- 세션 A
-- 세션 B
COMMIT;
- 행 레벨 록(ROW LEVEL LOCK)
SQL문으로 조작하는 대상 데이터가 테이블의 특정 행 데이터일 경우, 해당 행만 LOCK 이 발생한다는 의미
- 테이블 레벨 록(TABLE LEVEL LOCK)
테이블에 변경되는 행의 수와는 상관없이, 데이터 조작 명령어(INSERT, DELETE, UPDATE, SELECT)를 사용하여 데이터가 변경 중인 테이블은 테이블 단위 잠금, 테이블 레벨 록이 걸릭 된다.
⇒ 데이터를 변경 중인 세션 외 다른 세션에서 데이터 정의어(DDL)을 통한 테이블의 구조를 변경할 수 없다.
- DML시, DML에 따라 행, 또는 행 전체에 행 레벨 락 걸려 해당 행 DML 불가