TCL (트렌젝션 제어어)

woom·2022년 10월 25일
0

ORACLE

목록 보기
9/13
post-thumbnail

🌼 TCL (Transaction Control Language)

  • 트렌젝션에 저장된 SQL 명령을 실제 테이블에 적용하여 실행하거나 적용하지 않고 취소하는 명령

  • 클라이언트에서 작성한 SQL 명령을 서버에 전달하여 테이블에 바로 적용하는 것이 아니라 트렌젝션에 저장하여 나중에 실행되도록 처리

  • 트렌젝션(TRANSACTION) : 세션에서 DBMS 서버에 전달되어 실행될 SQL 명령들을 저장하기 위한 작업단위 (SQL 명령 그룹)

  • 세션(SESSSION) : DBMS 서버에 접속하여 SQL 명령을 전달하여 실행하기 위한 사용자의 작업환경


📌 트렌젝션에 저장된 SQL 명령을 실제 테이블에 적용하는 방법

  • 커밋(COMMIT) 처리 → 커밋 처리후 트렌젝션 초기화

      1. 현재 세션에서 정상적으로 서버 접속을 종료한 경우 자동 커밋 처리
      1. DDL 명령 또는 DCL 명령을 작성하여 서버에 전달하여 경우 자동 커밋 처리
      1. DML 명령을 작성하여 서버에 전달한 경우 COMMIT 명령을 사용하여 커밋 처리

📌트렌젝션에 저장된 SQL 명령을 실제 테이블에 적용하지 않고 삭제하는 방법

  • 롤백(ROLLBACK) 처리
      1. 현재 세션에서 비정상적으로 서버 접속을 종료한 경우 자동 롤백 처리
      1. DML 명령을 작성하여 서버에 전달한 경우 ROLLBACK 명령을 사용하여 롤백 처리

📌 트렌젝션의 기능

  1. 서버에 전달된 SQL 명령이 잘못된 경우 롤백 처리를 통한 데이타 복구를 위해 트렌젝션 사용
    - 데이터 무결성 유지를 위한 방법
  2. 현재 세션에서 작업중인 결과를 커밋 전까지 다른 세션에서 검색되지 않도록 트렌젝션 사용
    - 데이터 일관성을 제공하는 방법
  3. 현재 세션에서 작업중인 테이블의 행을 다른 세션에서 작업하지 못하도록 트렌젝션을 사용하여 데이타 잠금(LOCK) 기능 제공

🐣 예제


--DEPT 테이블에 저장된 모든 부서정보 검색
--트렌젝션에 저장된 SQL 명령이 없으므로 실제 테이블의 행을 검색하여 결과 제공
SELECT * FROM DEPT;

--DEPT 테이블에서 부서번호가 50인 부서정보 삭제
--DELETE 명령을 서버에 전달하면 DEPT 테이블의 행을 삭제하지 않고 트렌젝션에 DELETE 명령 저장
DELETE FROM DEPT WHERE DEPTNO=50;

--실제 테이블의 행을 검색하여 트렌젝션에 저장된 SQL 명령(DELETE)이 실행된 결과 제공
SELECT * FROM DEPT;

--롤백 처리 - 트렌젝션에 저장된 SQL 명령 삭제
ROLLBACK;
SELECT * FROM DEPT;--실제 테이블의 검색결과 제공 (삭제명령실행X)

--DEPT 테이블에서 부서번호가 50인 부서정보 삭제
DELETE FROM DEPT WHERE DEPTNO=50;

--커밋 처리 : 트렌젝션에 저장된 SQL 명령(DELETE)을 실제 테이블에 적용 - 트렌젝션 초기화
COMMIT;--실제 테이블에 저장된 행 삭제
SELECT * FROM DEPT;--실제 테이블의 검색결과 제공 (삭제명령실행)

--EMP 테이블에 저장된 모든 사원정보 삭제
DELETE FROM EMP;
SELECT * FROM EMP;

--서버에 전달된 SQL 명령이 잘못된 경우 롤백 처리를 통한 데이타 복구를 위해 트렌젝션 사용 
--데이타 무결성 유지를 위한 방법
ROLLBACK;
SELECT * FROM EMP;

--현재 세션에서 작업중인 결과를 커밋 전까지 다른 세션에서 검색되지 않도록 트렌젝션 사용 
--데이타 일관성을 제공하는 방법
--데이타 일관성 : DBMS를 사용하는 모든 사용자에게 동일한 검색결과를 제공

--BONUS 테이블에서 사원이름이 KIM인 사원정보 삭제
SELECT * FROM BONUS;
DELETE FROM BONUS WHERE ENAME='KIM';
SELECT * FROM BONUS;

--다른 세션에서는 BONUS 테이블에서 사원이름이 KIM인 사원정보 검색
--현재 세션에서 커밋 처리를 하기 전까지 다른 세션에서는 SQL 명령이 실행되기 전의 검색결과 제공
--데이타 일관성
COMMIT;--현재 세션에서 커밋 처리를 해야만 다른 세션에서도 SQL 명령이 적용된 검색결과 제공

--데이타 잠김(LOCK) 기능을 제공하기 위해 트렌젝션 사용
--DBMS는 다중 사용자 환경으로 같은 테이블의 행을 다른 세션에서 조작 가능
--현재 세션에서 작업중인 테이블의 행을 다른 세션에서 작업하지 못하도록 
--트렌젝션을 사용하여 데이타 잠금 기능 제공

--BONUS 테이블에서 사원이름이 ALLEN인 사원의 급여를 2000으로 변경
SELECT * FROM BONUS;
UPDATE BONUS SET SAL=2000 WHERE ENAME='ALLEN';--데이타 잠김
SELECT * FROM BONUS;

--다른 세션에서 BONUS 테이블에서 사원이름이 ALLEN인 사원의 성과급을 급여의 50%로 변경
--UPDATE BONUS SET COMM=SAL*0.5 WHERE ENAME='ALLEN';
--현재 세션에서 작업중인 테이블의 행을 다른 세션에서 조작할 경우
--트렌젝션에 의해 데이타 잠김 기능으로 인해 세션 일시 중지
--현재 세션에서 작업중인 DML 명령을 커밋 또는 롤백 처리를 해야만 다른 세션의 DML 명령이 실행
COMMIT;




📌 SAVEPOINT

  • 트렌젝션에 라벨(위치정보)을 붙이는 명령

  • 트렌젝션에 저장된 라벨을 이용하여 원하는 위치의 DML 명령들을 롤백 처리하기 위해 사용

  • 형식) SAVEPOINT 라벨명

  • SAVEPOINT 명령으로 설정된 라벨을 이용하여 롤백 처리

  • 형식) ROLLBACK TO 라벨명

🐣 예제

--BONUS 테이블에서 사원이름이 ALLEN인 사원정보 삭제
SELECT * FROM BONUS;
DELETE FROM BONUS WHERE ENAME='ALLEN';
SELECT * FROM BONUS;

--BONUS 테이블에서 사원이름이 MARTIN인 사원정보 삭제
DELETE FROM BONUS WHERE ENAME='MARTIN';
SELECT * FROM BONUS;

--롤백 처리
ROLLBACK;--트렌젝션에 저장된 모든 DML 명령을 삭제
SELECT * FROM BONUS;

--BONUS 테이블에서 사원이름이 ALLEN인 사원정보 삭제
DELETE FROM BONUS WHERE ENAME='ALLEN';
SELECT * FROM BONUS;
SAVEPOINT ALLEN_DELETE_AFTER;--트렌젝션에 라벨 부착

--BONUS 테이블에서 사원이름이 MARTIN인 사원정보 삭제
DELETE FROM BONUS WHERE ENAME='MARTIN';
SELECT * FROM BONUS;

--SAVEPOINT 명령으로 설정된 라벨을 이용하여 롤백 처리
--형식) ROLLBACK TO 라벨명
--트렌젝션에서 사원이름이 MARTIN인 사원정보를 삭제하는 DELETE 명령 제거
ROLLBACK TO ALLEN_DELETE_AFTER;
SELECT * FROM BONUS;

ROLLBACK;--트렌젝션에 저장된 모든 DML 명령 제거
SELECT * FROM BONUS;


profile
Study Log 📂

0개의 댓글