GaussDB 并发自治事务数达到最大值处理案例

举报
石岩上的苍松 发表于 2025/08/19 20:26:52 2025/08/19
【摘要】 GaussDB的自治事务在使用上要了解规则约束,才会让我们使用起来得心应手。

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 自治事务约束


1)自治事务执行时,将会在后台启动自治事务session,可以通过max_concurrent_autonomous_transactions设置自治事务执行的最大并行数量,取值范围:0~10000,默认值:10。
2)当max_concurrent_autonomous_transactions参数设置为0时,自治事务将无法执行。
3)自治事务新启session后,将使用默认session参数,不共享主session下对象(包括session级别变量、本地临时变量、全局临时表的数据等)。
4)自治事务理论上限为10000,实际上限为动态值,参考GUC参数max_concurrent_autonomous_transactions描述。
5)自治事务受通信缓冲区影响,返回给客户端的信息大小受限于通信缓冲区长度,超过通信缓冲区长度时报错。
6)自治事务执行期间,主事务会给自治事务加锁,异常情况导致此锁残留的场景下,需要依赖gs_clean清理残留锁,清理周期由GUC参数 gs_clean_timeout控制,默认值为60秒。自治事务的锁不受lock timeout影响,锁超时时间为2147483s,自治事务执行超过此时间会报错锁超时。
7)自治事务设置建立连接超时时间5s,建立连接尝试5次。建立连接期间不立即响应信号,每次建立连接前检查信号。高并发、高CPU、高内存,以及线程池扩容场景下可能存在超时报错现象。
8)在PACKAGE SPECIFICATION或PACKAGE BODY SPECIFICATION中声明自治事务PRAGMA AUTONOMOUS_TRANSACTION语法,可成功创建PACKAGE,但自治事务不生效。
触发器函数不支持自治事务。

6 批注

自治事务也有优点:1.隔离性:自治事务允许你在一个事务中处理多个操作,这些操作可以独立地成功或失败,互不影响。2.灵活性:适用于复杂的业务逻辑,其中某些操作的成功或失败不应影响其他操作。3.在某些情况下,可以减少锁的竞争,提高并发性能。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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