日期:2014-05-16  浏览次数:20578 次

Oracle自治事务pragma autonomous_transaction的介绍

transaction has no link to the calling transaction, so only commited data can be shared by both transactions.
自治事务允许你离开调用的事务上下文,执行一个独立的事务,然后返回调用的事务而不会影响到调用事务的状态。自治事务和调用事务不同,只有提交的事务才会在事务见共享。


The following types of PL/SQL blocks can be defined as autonomous transactions:
以下的PL/SQL代码块可以定义为自治事务。

??? * Stored procedures and functions. 存储过程和函数
??? * Local procedures and functions defined in a PL/SQL declaration block. 定义在声明块里的本地存储过程和函数
??? * Packaged procedures and functions. 打包的存储过程和函数
??? * Type methods. 类型方法
??? * Top-level anonymous blocks. 顶层的匿名块

The easiest way to understand autonomous transactions is to see them in action. To do this, we create a test table and populate it with two rows. Notice that the data is not commited.
最简单的理解自治事务的方法是查看他们的行为。我们创建一个测试表格,然后放入2行数据,注意数据没有提交。


??? CREATE TABLE at_test (
????? id NUMBER NOT NULL,
????? description VARCHAR2(50) NOT NULL
??? );

??? INSERT INTO at_test (id, description) VALUES (1, 'Description for 1');
??? INSERT INTO at_test (id, description) VALUES (2, 'Description for 2');

??? SELECT * FROM at_test;

??????????? ID DESCRIPTION
??? ---------- --------------------------------------------------
???????????? 1 Description for 1
???????????? 2 Description for 2

??? 2 rows selected.

??? SQL>

Next, we insert another 8 rows using an anonymous block declared as an autonomous transaction, which contains a commit statement.
下一步,我们使用匿名的自治事务块插入另外8行数据,同时提交。

??? DECLARE
????? PRAGMA AUTONOMOUS_TRANSACTION;
??? BEGIN
????? FOR i IN 3 .. 10 LOOP
??????? INSERT INTO at_test (id, description)
??????? VALUES (i, 'Description for ' || i);
????? END LOOP;
????? COMMIT;
??? END;
??? /

??? PL/SQL procedure successfully completed.

??? SELECT * FROM at_test;

??????????? ID DESCRIPTION
??? ---------- --------------------------------------------------
???????????? 1 Description for 1
???????????? 2 Description for 2
???????????? 3 Description for 3
???????????? 4 Description for 4
???????????? 5 Description for 5
???????????? 6 Description for 6
???????????? 7 Description for 7
???????????? 8 Description for 8
???????????? 9 Description for 9
??????????? 10 Description for 10

??? 10 rows selected.

??? SQL>

As expected, we now have 10 rows in the table. If we now issue a rollback statement we get the following result.
和预想的一样,我们得到了10行数据。如果我们执行一个回滚(rollback)语句,我们得到了如下的结果

??? ROLLBACK;
??? SELECT * FROM at_test;

??????????? ID DESCRIPTION
??? ---------- --------------------------------------------------
???????????? 3 Description for 3
???????????? 4 Description for 4
???????????? 5 Description for 5
???????????? 6 Description for 6
???????????? 7 Description for 7
???????????? 8 Description for 8
???????????? 9 Description for 9
??????????? 10 Description for 10

??? 8 rows selected.

??? SQL>

The 2 rows inserted by our current session (transaction) have been rolled back, while the rows inserted by the autonomous transactions remain. The presence of the PRAGMA AUTONOMOUS_TRANSACTION compiler directive made the anonymous block run in its own transaction, so the internal commit statement did not affect the calling session. As a result rollback was still able to affect the DML issued by the current statement.
被我们当前事务插入的2行数据被回滚了,而被自治事务插入的数据继续存在。编译描述符 PRAGMA AUTONOMOUS_TRANSACTION 使得自治块在自己的事务里运行,所以内部的提交语句不会影响调用方的事务。

Autonomous transactions are commonly used by error logging routines, where the error messages must be preserved, regardless of the the commit/rollback status of the transaction. For example, the following table holds basic error messages.
自治事务一般用于日常的错误日志,错误信息必须保留,无