在 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 技术支持进行咨询。