1 业务背景
自治事务(Autonomous Transactions)是一种高级特性,允许你在一个事务中执行另一个独立的事务。这种机制特别有用,尤其是在需要在一个事务中执行多个操作但又不想因为其中一个操作失败而影响整个事务的场景。
2 业务影响
在业务触发情况下,自治事务数会达到瓶劲,GaussDB默认为10个。
如:

3 处理方法
将max_concurrent_autonomous_transaction值按照应用开启的并发数设置,比较开启16个并发,那么这个参数要比这个值大,建议值20~30左右。
默认值:
gaussdb=>
gaussdb=>
gaussdb=> show max_concurrent_autonomous_transactions;
max_concurrent_autonomous_transactions
----------------------------------------
10
(1 row)
gaussdb=>
如将max_concurrent_autonomous_transactions值改为20
gs_guc set -Z datanode -I all -N all -c "max_concurrent_autonomous_transactions='20'";
The gs_guc run with the following arguments: [gs_guc -Z datanode -I all -N all -c max_concurrent_autonomous_transactions=10 set ].
Begin to perform the total nodes: 3.
Popen count is 3, Popen success count is 3, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 3, Command success count is 3, Command failure count is 0.
Total instances: 3. Failed instances: 0.
ALL: Success to perform gs_guc!
[Ruby@dtest1 ~]$ cm_ctl stop && cm_ctl start
gaussdb=> show max_concurrent_autonomous_transactions;
max_concurrent_autonomous_transactions
----------------------------------------
20
(1 row)
注: max_concurrent_autonomous_transactions参数的修改需要重启服务。
4 普及自治事务
针对这个问题一起普及自治事务知识点:
1)自治事务用法:
PRAGMA AUTONOMOUS_TRANSACTION,以改标识符表明该存储过程里面包含有自治事务。且必须放在声明部分,即"begin"前面
2)与oracle主要区别
在存储过程中,GaussDB的自治事务"递交"动作 commit无需显式 指定,"回退"动作rollback 则需要指定 ,但在oracle数据库,自治事务递交与回退操作都需要显式指定 。GaussDB数据库自治事务支持以下场景:存储过程,函数,匿名块,不支持在触发器中使用。oracle数据库,自治事务支持存储过程,函数,匿名块,以及触发器。
例:以下是显式加了rollback回退,如果不加commit情况下,默认提交。
csdn=> create or replace procedure autonomous_4(a int, b int) as
csdn$> declare
csdn$> num3 int :=a;
csdn$> num4 int :=b;>
csdn$> PRAGMA AUTONOMOUS_TRANSACTION;
csdn$> BEGIN
csdn$> INSERT INTO t2 values(num3,num4);
csdn$> rollback;
csdn$> dbe_output.print_line('just use call.');
csdn$> end;
csdn$> /
CREATE PROCEDURE
csdn=> call autonomous_4(300,700);
just use call.
autonomous_4
--------------
(1 row)
csdn=> select * from t2;
a | b
-----+-----
1 | 2
200 | 500
(2 rows)
5 自治事务约束
- 自治事务执行时,将会在后台启动自治事务session,可以通过max_concurrent_autonomous_transactions设置自治事务执行的最大并行数量,取值范围:0~10000,默认值:10。
- 当max_concurrent_autonomous_transactions参数设置为0时,自治事务将无法执行。
- 自治事务新启session后,将使用默认session参数,不共享主session下对象(包括session级别变量、本地临时变量、全局临时表的数据等)。
- 自治事务理论上限为10000,实际上限为动态值,参考GUC参数max_concurrent_autonomous_transactions描述。
- 自治事务受通信缓冲区影响,返回给客户端的信息大小受限于通信缓冲区长度,超过通信缓冲区长度时报错。
- 自治事务执行期间,主事务会给自治事务加锁,异常情况导致此锁残留的场景下,需要依赖gs_clean清理残留锁,清理周期由GUC参数 gs_clean_timeout控制,默认值为60秒。自治事务的锁不受lock timeout影响,锁超时时间为2147483s,自治事务执行超过此时间会报错锁超时。
- 自治事务设置建立连接超时时间5s,建立连接尝试5次。建立连接期间不立即响应信号,每次建立连接前检查信号。高并发、高CPU、高内存,以及线程池扩容场景下可能存在超时报错现象。
- 在PACKAGE SPECIFICATION或PACKAGE BODY SPECIFICATION中声明自治事务PRAGMA AUTONOMOUS_TRANSACTION语法,可成功创建PACKAGE,但自治事务不生效。
- 触发器函数不支持自治事务。
6 批注
自治事务也有优点:1.隔离性:自治事务允许你在一个事务中处理多个操作,这些操作可以独立地成功或失败,互不影响。2.灵活性:适用于复杂的业务逻辑,其中某些操作的成功或失败不应影响其他操作。3.在某些情况下,可以减少锁的竞争,提高并发性能。