在 OceanBase 数据库中,如果 ob_trx_idle_timeout(即事务内两条 SQL 的间隔)设置的过小的话,可能会造成事务回滚。本文介绍事务回滚的原因以及解决方法。
适用版本
OceanBase 数据库所有版本
问题现象
执行以下 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 技术支持进行咨询。