暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES PLSQL自治事务

原创 数据猿 2024-01-04
232


金仓数据库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)

参考资料

《KingbaseES产品手册》

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论