自主交易 Oracle PL/SQL:提交、回滚

PL/SQL 中的 TCL 语句是什么?

TCL 代表事务控制语句。它将保存待处理的事务或回滚待处理的事务。这些语句起着至关重要的作用,因为除非保存事务,否则通过 DML 语句进行的更改将不会保存在数据库中。以下是不同的 TCL 语句。

犯罪 保存所有待处理的交易
回滚 放弃所有待处理的交易
保存点 在事务中创建一个点,稍后可以进行回滚
回滚到 丢弃所有未决交易,直到指定

交易将在以下情形下完成。

  • 当发出上述任何一条语句时(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 的工资上涨反映出来,因为该区块已作为单独的交易生成并在最后保存。
  • 因此,无论主事务中的保存/丢弃如何,自主事务中的更改都已保存,而不会影响主事务中的更改。