事务内部语句超时回滚要怎么处理?

在 OceanBase 数据库中,如果 ob_trx_idle_timeout(即事务内两条 SQL 的间隔)设置的过小的话,可能会造成事务回滚。本文介绍事务回滚的原因以及解决方法。

适用版本

Oce即anBase 数据库所有版本

问题现象

执行以下 SQL 语句,开启一个事务。

obclient> CREATE TABLE test (id1 int); obclient> SET @@ob_query_timeout=200 * 1000 * 1000; obclient> SET @@ob_trx_timeout = 200 * 1000 * 1000; begin; insert into test values(1);

等待 150 秒,再执行以下语句。

obclient> INSERT INTO test VALUES(2); obclient> SELECT * FROM test; obclient> ROLLBACK;

在执行

INSERT INTO test VALUES(2)

时,会提示

Lost connection

;而

SELECT * FROM test

语句的结果为空,表示上述事务已经回滚。

可能原因

这是由于事务内两条SQL间隔如果超过

ob_trx_idle_timeout

,OceanBase 数据库端内部会强制停止会话,断开与客户端的链接,同时回滚事务,默认为 120s。不建议修改该系统变量,有关该系统变量的详细信息,请参见《OceanBase 数据库 参考指南》中的 **系统变量 **章节。

ob_trx_idle_timeout

的取值范围为 [100s,+∞)。如果设置的值小于 100s,则该变量不会生效,事务超时时间仍为 120s。

因此问题可能是由于会话中将

ob_trx_idle_timeout

设置得过小。

规避方式

OceanBase 数据库为解决长事务与悬挂事务引入了

ob_trx_idle_timeout

系统变量,该系统变量不建议修改。如果确实需要修改该变量,请联系 OceanBase 技术支持进行咨询。