자율적인 거래 Oracle PL/SQL: 커밋, 롤백
PL/SQL의 TCL 문이란 무엇입니까?
TCL은 거래 제어 문을 나타냅니다. 보류 중인 트랜잭션을 저장하거나 보류 중인 트랜잭션을 롤백합니다. 트랜잭션이 저장되지 않으면 DML 문을 통한 변경 사항이 데이터베이스에 저장되지 않기 때문에 이러한 문은 중요한 역할을 합니다. 다음은 다양한 TCL 문입니다.
COMMIT | 보류 중인 모든 거래를 저장합니다. |
롤백 | 보류 중인 거래를 모두 삭제합니다. |
세이브포인트 | 나중에 롤백을 수행할 수 있는 트랜잭션 지점을 생성합니다. |
다음으로 롤백 | 지정된 날짜까지 보류 중인 모든 트랜잭션을 삭제합니다. |
다음 시나리오에 따라 거래가 완료됩니다.
- 위 명세서 중 하나라도 발행된 경우(SAVEPOINT 제외)
- DDL문이 발행되는 경우. (DDL은 자동 커밋 문입니다)
- DCL 문이 발행되는 시기. (DCL은 자동 커밋 문입니다)
자율 거래란?
PL/SQL에서는 데이터에 대한 모든 수정을 트랜잭션이라고 합니다. 저장/폐기가 적용될 때 트랜잭션은 완료된 것으로 간주됩니다. 저장/폐기가 제공되지 않으면 트랜잭션이 완료된 것으로 간주되지 않으며 데이터에 대한 수정 사항이 서버에 영구적으로 적용되지 않습니다.
세션 중에 수행된 일부 수정과 관계없이, PL / SQL 전체 수정 사항을 단일 트랜잭션으로 처리하고 이 트랜잭션을 저장/삭제하면 해당 세션에서 보류 중인 전체 변경 사항에 영향을 미칩니다. 자율 트랜잭션은 개발자에게 별도의 트랜잭션에서 변경을 수행하고 기본 세션 트랜잭션에 영향을 주지 않고 해당 특정 트랜잭션을 저장/삭제할 수 있는 기능을 제공합니다.
- 이 자율 트랜잭션은 하위 프로그램 수준에서 지정할 수 있습니다.
- 하위 프로그램이 다른 트랜잭션에서 작동하도록 하려면 해당 블록의 선언 섹션에 'PRAGMA AUTONOMOUS_TRANSATION' 키워드를 제공해야 합니다.
- 이는 컴파일러에게 이를 별도의 트랜잭션으로 처리하도록 지시하며 이 블록 내부의 저장/삭제는 기본 트랜잭션에 반영되지 않습니다.
- 언제든지 하나의 트랜잭션만 활성화될 수 있으므로 이 자율 트랜잭션에서 기본 트랜잭션으로 이동하기 전에 COMMIT 또는 ROLLBACK을 실행하는 것이 필수입니다.
- 따라서 자율적인 트랜잭션을 만든 후에는 이를 저장하고 트랜잭션을 완료해야 하며 그 후에만 기본 트랜잭션으로 돌아갈 수 있습니다.
구문 :
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <executin_part> [COMMIT|ROLLBACK] END; /
- 위 구문에서 블록은 자율적인 트랜잭션으로 만들어졌습니다.
예제 1: 이번 예시에서는 자율 트랜잭션이 어떻게 작동하는지 알아보겠습니다.
DECLARE l_salary NUMBER; PROCEDURE nested_block IS PRAGMA autonomous_transaction; BEGIN UPDATE emp SET salary = salary + 15000 WHERE emp_no = 1002; COMMIT; END; BEGIN SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001; dbms_output.put_line('Before Salary of 1001 is'|| l_salary); SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002; dbms_output.put_line('Before Salary of 1002 is'|| l_salary); UPDATE emp SET salary = salary + 5000 WHERE emp_no = 1001; nested_block; ROLLBACK; SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001; dbms_output.put_line('After Salary of 1001 is'|| l_salary); SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002; dbms_output.put_line('After Salary of 1002 is '|| l_salary); end;
산출
Before:Salary of 1001 is 15000 Before:Salary of 1002 is 10000 After:Salary of 1001 is 15000 After:Salary of 1002 is 25000
코드 설명 :
- 코드 라인 2: l_salary를 NUMBER로 선언합니다.
- 코드 라인 3:nested_block 프로시저 선언
- 코드 라인 4: Nested_block 프로시저를 'AUTONOMOUS_TRANSACTION'으로 만듭니다.
- 코드 라인 7-9: 직원 번호 1002의 급여를 15000만큼 인상합니다.
- 코드 라인 10: 트랜잭션을 커밋합니다.
- 코드 라인 13-16: 변경 전 직원 1001과 1002의 급여 세부 정보를 인쇄합니다.
- 코드 라인 17-19: 직원 번호 1001의 급여를 5000만큼 인상합니다.
- 코드 라인 20: nested_block 프로시저를 호출합니다.
- 코드 라인 21: 주요 거래를 폐기합니다.
- 코드 라인 22-25: 변경 후 직원 1001과 1002의 급여 세부 정보를 인쇄합니다.
- 1001번 사원의 급여 인상은 주 거래가 폐기되었기 때문에 반영되지 않습니다. 1002번 사원의 급여 인상은 해당 블록이 별도의 거래로 생성되어 마지막에 저장되었기 때문에 반영되었습니다.
- 따라서 기본 트랜잭션의 저장/폐기와 관계없이 자율 트랜잭션의 변경 사항은 기본 트랜잭션 변경 사항에 영향을 주지 않고 저장되었습니다.