openGauss自治事务应用详解

举报
redtea 发表于 2025/09/25 23:41:45 2025/09/25
【摘要】 openGauss自治事务是通过PRAGMA AUTONOMOUS_TRANSACTION声明的独立子事务机制,能够在存储过程和函数中创建与主事务相互隔离的操作单元。该功能主要应用于需要数据持久化的日志记录、审计跟踪和异常处理等场景,确保关键信息不因主事务回滚而丢失。与Oracle通过内存隔离实现的方式不同,openGauss采用新建连接并复制主事务内存的实现机制。

1 自治事务概述

1.1 openGauss自治事务概念

自治事务(Autonomous Transaction)​​允许在一个主事务中创建一个独立的事务(子事务)。这个子事务可以独立提交或回滚,而不影响主事务的状态;同样,主事务的回滚也不会影响自治事务的结果。

1.2自治事务应用场景

(1)日志记录

在事务中记录操作日志,即使主事务回滚,日志仍保留。

(2)审计跟踪​

确保审计信息(如谁在何时做了什么)不被主事务的失败影响。

(3)异常处理

在异常发生时通过自治事务保存错误信息,而不中断主事务。

2创建自治事务的语法格式

自治事务可以在存储过程、函数和匿名块中定义,使用PRAGMA AUTONOMOUS_TRANSACTION关键字来声明。

2.1 定义含有中自治事务的存储过程的语法格式

CREATE [OR REPLACE] PROCEDURE procedure_name([paramList ])

{ IS|AS}

DECLARE

-- 声明变量、常量、游标等

-- 声明自治事务

PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

-- 执行部分(SQL语句、控制流语句)

END;

2.2 定义含有中自治事务的函数的语法格式

openGauss 中,定义含有自治事务的函数的语法格式如下:

CREATE OR REPLACE FUNCTION function_name (parameter_list)

RETURNS return_type

{ IS|AS}

DECLARE

DECLARE

--声明该函数包含自治事务

PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

-- 执行部分(SQL语句、控制流语句)

END;

3 自治事务应用举例

3.1 含有自治事务的存储过程及调用

-- 创建表t1

CREATE TABLE T1(A INT, B INT);

INSERT INTO T1(A,B) VALUES(1,2);

SELECT * FROM T1;

-- 创建包含自治事务的存储过程

CREATE OR REPLACE PROCEDURE p_autonomous_1(in a int, in b int)

AS

DECLARE

       num1 int := a;

       num2 int := b;

       --自治事务标识

       PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

       INSERT INTO T1 VALUES(num1, num2);

END;

-- 创建调用自治事务存储过程的普通存储过程

CREATE OR REPLACE PROCEDURE p_autonomous_2(in a int, in b int) AS

DECLARE

BEGIN

      INSERT INTO t1 VALUES(123, 456);

      --调用自治事务存储过程p_autonomous_1

      p_autonomous_1(a,b);

       --回滚主事务

      ROLLBACK;

END;

--删除t1中的记录

delete from t1;

-- 调用普通存储过程

CALL p_autonomous_2(11,22);

-- 查看表结果

SELECT * FROM t1;--得到一条记录11 22


autonomous.png

图3-1 自治事务存储过程

查询结果表明 p_autonomous_2中主事务在调用了含有自治事务的存储过程p_autonomous_1,主事务的回滚并没有影响自治事务的执行。

3.2 含有自治事务的函数及调用

-- 创建表t2

CREATE TABLE t2 (a int, b varchar(50));

--创建函数f_autonomous,含有自治事务

CREATE OR REPLACE FUNCTION f_autonomous_1(i int,c varchar(50))

RETURN int

AS

DECLARE

        PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

       INSERT INTO t2 VALUES (i, c);

       IF i % 2 = 0 THEN

       COMMIT;

       ELSE

       ROLLBACK;

       END IF;

       RETURN i % 2;

END;

--调用函数f_autonomous_1

SELECT f_autonomous_1(3,'def1');--返回1

 --查询t2

 select * from t2;--没有记录

  --调用函数f_autonomous_1

 SELECT f_autonomous_1(4,'def2');--返回0

 --查询t2

          select * from t2;--查询到记录 4 def2

 --删除t2中记录

 delete from t2;

 --创建函数f_autonomous_2,主事务调用自治事务

CREATE OR REPLACE FUNCTION f_autonomous_2(i int,c varchar(50))

RETURN int

AS

declare

     m int;

     BEGIN

            INSERT INTO t2 VALUES (2, 'abc');

           m:=f_autonomous_1(i,c);

           ROLLBACK;

           RETURN m;

END;

--调用函数f_autonomous_1

SELECT f_autonomous_2(6,'def3');--返回0

--查询t2

select * from t2;--查询到记录6 def3


fautonomous.png


图3-2 自治事务函数

查询结果表明 _autonomous_2中主事务在调用了含有自治事务的函数f_autonomous_1,主事务的回滚并没有影响自治事务的执行。

4 openGauss自治事务注意事项

使用openGauss自治事务时,应注意:

(1)触发器函数不支持自治事务。

(2)函数或者存储过程的自治事务块中,静态SQL语句不支持变量传递。

(3)自治事务不支持执行嵌套。

(4)包含自治事务的函数,不支持参数传递的返回值。

(5)包含自治事务的存储过程/函数,不支持exception异常处理。

5 openGauss自治事务与oracle自治事务的异同

openGauss的自治事务与 Oracle 的自治事务存在区别和联系。

5.1 联系

(1)基本概念一致

两者都允许在主事务中创建一个独立的事务,其提交和回滚不受主事务的影响。

(2)声明方式类似

都通过 PRAGMA AUTONOMOUS_TRANSACTION关键字来声明。

(3)典型应用场景相似

常用于日志记录、错误处理和异步通知等需要独立于主事务执行数据库操作的场景。

5.2 区别

5.2.1 实现原理

(1)Oracle自治事务

自治事务与主事务隔离,除了参数和基本连接信息外,其他内存上下文包括事务都是隔离的。

(2)openGauss自治事务

自治事务实际上是新建了一个连接,并且把主事务中的所有内存都往自治事务里复制一份,执行完了再复制回来。

5.2.2 性能表现

(1)Oracle性能表现

编译结果可以被其他会话共享使用,性能较好。

(2)openGauss性能表现

会复制主事务中的所有内存;自治事务里使用到的存储过程需要重新编译。

5.2.3 特性限制

(1) Oracle特性限制

自治事务可以嵌套,嵌套深度受 transactions参数制约。

(2)openGaus特性限制

自治事务不支持执行嵌套。

5.2.4 适用范围

(1)Oracle适用范围

在 PL/SQL 中,匿名块、函数、存储过程、数据包或触发器都可以定义自治事务。

(2)openGauss适用范围

用户自定义函数、存储过程支持自治事务,但触发器函数不支持。

6 总结

       openGauss自治事务通过独立子事务机制增强了数据操作的灵活性,尤其适用于需持久化日志和审计信息的场景。但其实现方式(内存复制)导致性能开销较大,且功能限制较多(如不支持嵌套和触发器)。用户在使用时应结合业务需求权衡其优缺点,并注意规避语法和功能限制。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。