-- 트랜잭션: 더 이상 분할할 수 없는 최소 수행 단위, 1개 이상의 DML로 이루어짐
-- TCL
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;
SELECT * FROM DEPT_TCL;
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;
-- 세션: 데이터베이스 접속을 시작으로 접속을 종료하기까지 전체 기간
-- 세션 내부에는 하나 이상의 트랜잭션이 존재
-- 읽기 일관성: 데이터 조작이 포함된 트랜잭션이 완료되기 전까지 데이터를 직접 조작하는 세션 외
-- 다른 세션에서는 데이터 조작 전 상태의 내용이 일관적으로 조회·출력·검색 되는 특성
DELETE FROM DEPT_TCL WHERE DEPTNO = 50;
COMMIT;
SELECT * FROM DEPT_TCL;
-- LOCK: 특정 세션에서 조작 중인 데이터는 트랜잭션이 완료되기 전까지
-- 다른 세션에서 조작할 수 없는 상태가 된다.
-- 세션A
SELECT * FROM DEPT_TCL;
-- UPDATE문을 실행하고 있는 세션A에서는 데이터에서는 변경되었지만
-- COMMIT은 되지 않은 상태이므로 세션 B에서는 변화가 없다.
UPDATE DEPT_TCL SET LOC = 'SEOUL' WHERE DEPTNO = 30;
-- 커밋을 실행하는 순간 세션B에서 대기중인 UPDATE문이 실행된다.
COMMIT;
-- 세션B
SELECT * FROM DEPT_TCL;
-- 세션A에서 데이터를 먼저 조작하고 있기 때문에 대기 상태가 된다.
-- HANG: 특정 세션에서 데이터 조작이 완료될 때까지 다른 세션에서 해당 데이터 조작을 기다리는 현상
UPDATE DEPT_TCL SET DNAME = 'DATABASE' WHERE DEPTNO = 30;
COMMIT;
-- 조작하는 대상 데이터가 테이블의 특정 행 데이터일 경우에
-- 해당 행만 LOCK이 발생한다는 의미로 '행 레벨 록'이라 정의한다.
-- 테이블 전체 행이 LOCK 상태여도 INSERT문의 수행은 가능하다.
-- 데이터 조작 명령어를 사용하여 데이터가 변경 중인 테이블은
-- 테이블 단위 잠금이라는 의미로 '테이블 레벨 록'이 걸린다.