首批通过分布式安全可靠测评,为关键业务系统打造
事务超时,错误代码 ERROR 4012
更新时间:2023-12-07 03:16
本文介绍 OceanBase 数据库 MySQL 模式下事务未提交超时后报 ERROR 4012 错误的处理方法。
问题现象
事务开启后,持续较长一段时间内未提交事务后,执行查询表数据的操作时报错。
obclient [test]> BEGIN;
Query OK, 0 rows affected
obclient [test]> SELECT * FROM ordr;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | NULL | 2022-04-02 14:03:31 |
| 2 | UK | NULL | 2022-04-02 14:03:31 |
| 3 | US | NULL | 2022-03-31 17:04:55 |
+----+------+-------+---------------------+
3 rows in set
/* 等待较长一段时间不操作*/
obclient [test] SELECT * FROM ordr;
ERROR 4012 (25000): Transaction timeout occurred, please rollback the transaction, set the variable ob_trx_timeout to a larger value and then restart the transaction
该报错信息对应的错误码信息如下:
错误码:ERROR 4012
OceanBase 错误码:6210
兼容 MySQL 错误码:4012
可能原因
事务未提交超时表示事务超过了指定的阈值仍未提交。当事务超过了指定的时间还没有提交时,系统就会报错。事务未提交超时由租户变量 ob_trx_timeout 控制,默认值为 86400000000 微秒,即 24 小时。
说明
OceanBase 数据库为了避免事务长时间不提交持有锁影响其他会话,设计了两个超时逻辑:事务空闲超时和事务未提交超时。通常只会有一个超时机制会先被触发。
解决方法
请参考以下步骤,查看并修改租户变量,再通过 ROLLBACK 语句回滚并提交事务后,继续操作。
查看租户变量
ob_trx_timeout的值,确认事务超时时间是否超过了设置的值。事务的未提交超时时间阈值由租户变量
ob_trx_timeout控制,单位为微秒,建议使用默认值 24 小时(86400000000 微秒)。说明
以下设置变量的方法仅对当前会话有效,如果需要保证设置永久生效,请使用
SET GLOBAL语法配置相同变量后,再重启会话使其生效。obclient> SHOW VARIABLES LIKE 'ob_trx_timeout'; +----------------+-----------+ | Variable_name | Value | +----------------+-----------+ | ob_trx_timeout | 100000000 | +----------------+-----------+ 1 row in set obclient [test]> SET SESSION ob_trx_timeout=86400000000; Query OK, 0 rows affected使用
ROLLBACK回滚事务。obclient> ROLLBACK; Query OK, 0 rows affected执行
COMMIT提交事务。obclient> COMMIT; Query OK, 0 rows affected再次查询
ordr表数据,操作成功。obclient [test]> SELECT * FROM ordr; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 1 | CN | NULL | 2022-04-02 14:03:31 | | 2 | UK | NULL | 2022-04-02 14:03:31 | | 3 | US | NULL | 2022-03-31 17:04:55 | +----+------+-------+---------------------+ 3 rows in set