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