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