其实很早之前就知道自治事务这个概念,也大概知道自治事务的提交不会影响其他事务,但很少用。但今天突然想到一个问题,如果我在创建一个表(凡是DDL之类的操作,因为执行DDL操作就隐含提交了),又不想其他的操作提交,该怎么办呢?就用自治事务。下面做一个测试。
SQL> select * from test;
ID NAME
---------- ------------------------------
1 test
2 test2
3 wang
4 guang
SQL> update test set name='qi' where id=1;
1 row updated
SQL> drop table test_auto;
Table dropped
SQL> rollback;
Rollback complete
SQL> select * from test;
ID NAME
---------- ------------------------------
1 qi
2 test2
3 wang
4 guang
因为drop 是DDL操作,在DROP的同时就commit了,所以rollback已经不起作用了,下面试下自治事务。
SQL> create procedure test_autonomous
2 is
3 pragma autonomous_transaction;
4 begin
5 execute immeidate 'create table test_auto (id number,salary varchar2(30))';
6 exception
7 when others then
8 rollback;
9 end test_autonomous;
10 /
SQL> select * from test;
ID NAME
---------- ------------------------------
1 qi
2 test2
3 wang
4 guang
SQL> select * from test_auto;
select * from test_auto
ORA-00942: table or view does not exist
SQL> update test set name='test auto' where id=1;
1 row updated
SQL> execute test_autonomous;
PL/SQL procedure successfully completed
SQL> select * from test_auto;
ID SALARY
---------- ------------------------------
SQL> rollback;
Rollback complete
SQL> select * from test;
ID NAME
---------- ------------------------------
1 qi
2 test2
3 wang
4 guang
已经创建了表test_auto,但是因为创建表的操作是自治事务,所以不会影响到test的更新这个事务操作,这就是自治事务的一个好处。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13387766/viewspace-510014/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13387766/viewspace-510014/