金仓数据库KingbaseES PLSQL自治事务
关键字:
自治事务、PRAGMA AUTONOMOUS_TRANSACTION、人大金仓
什么是自治事务?
自治事务是由另一个事务(主事务)启动的独立事务。自治事务独立进行各种SQL操作,进行事务的提交或回滚。
在PLSQL中,如下面的场景,func1调用func2,如果是正常的无自治事务的场景,func1中的insert会被func2中的commit提交,即使后面func1进行了rollback操作。
func1()
insert1;
func2()
insert2;
commit;
rollback;
如果在func2中使用自治事务(PRAGMA AUTONOMOUS_TRANSACTION;),func2中的事务就会独立出来,和func1不再有关系。insert1不会被func2的commit影响,最后会被func1的rollback回滚。
func1()
insert1;
func2()
PRAGMA AUTONOMOUS_TRANSACTION;
insert2;
commit;
rollback;
自治事务启动后是完全独立的。它与主事务不共享锁、资源或提交依赖项。即使主事务回滚,也可以记录事件、增加重置计数器等。自治事务可帮助构建模块化、可重用的软件组件。也可以将自治事务封装在存储的子程序中。调用应用程序不需要知道由存储的子程序完成的操作是成功还是失败。
自治事务实例
1.非自治事务
create table t1 (a int);
\set SQLTERM /
create or replace procedure pr1() as
declare
begin
insert into t1 values(2);
commit;
end;
/
begin
insert into t1 values(1);
pr1();
rollback;
end;
/
\set SQLTERM ;
select * from t1;
执行结果:
a
---
1
2
(2 rows)
2.简单自治事务
truncate table t1;
\set SQLTERM /
create or replace procedure pr1() as
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into t1 values(2);
commit;
end;
/
begin
insert into t1 values(1);
pr1();
rollback;
end;
/
\set SQLTERM ;
select * from t1;
执行结果:
a
---
2
(1 row)
3.不显示提交/回滚的自治事务
与oracle不同的是,kes不显示提交/回滚自治事务不会抛出异常,而是默认提交
truncate table t1;
\set SQLTERM /
create or replace procedure pr1() as
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into t1 values(2);
end;
/
begin
insert into t1 values(1);
pr1();
rollback;
end;
/
\set SQLTERM ;
select * from t1;
执行结果:
a
---
2
(1 row)
4.自治事务内可多次提交/回滚,且不影响外层事务
truncate table t1;
\set SQLTERM /
create or replace procedure pr1() as
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into t1 values(2);
commit;
insert into t1 values(3);
rollback;
insert into t1 values(4);
commit;
insert into t1 values(5);
rollback;
insert into t1 values(6);
end;
/
begin
insert into t1 values(1);
pr1();
rollback;
end;
/
\set SQLTERM ;
select * from t1;
执行结果:
a
---
2
4
6
(3 rows)