首批通过分布式安全可靠测评,为关键业务系统打造
事务超时,错误代码 ORA-00600
更新时间:2024-01-22 01:56
本文介绍 OceanBase 数据库 Oracle 模式下事务未提交超时后报 ORA-00600 错误的处理方法。
问题现象
事务开启后,持续较长一段时间内未提交事务后,执行查询表数据的操作时报错。
obclient [SYS]> CREATE TABLE ordr(
id number NOT NULL PRIMARY KEY
, name varchar(10) NOT NULL
, value number
,gmt_create timestamp NOT NULL DEFAULT current_timestamp); //准备数据
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO ordr(id, name, value, gmt_create) VALUES (1,'CN',10001, current_timestamp);
Query OK, 1 row affected
obclient [SYS]> INSERT INTO ordr(id, name, value) VALUES (2,'US', 10002);
Query OK, 1 rows affected
obclient [SYS]> INSERT INTO ordr(id, name, value) VALUES (3,'EN', 10003);
Query OK, 1 rows affected
obclient [SYS]> SELECT sysdate, t.* FROM ordr t;
+-----------+----+------+-------+------------------------------+
| SYSDATE | ID | NAME | VALUE | GMT_CREATE |
+-----------+----+------+-------+------------------------------+
| 05-SEP-22 | 1 | CN | 10001 | 05-SEP-22 04.34.37.145469 PM |
| 05-SEP-22 | 2 | US | 10002 | 05-SEP-22 04.34.46.776463 PM |
| 05-SEP-22 | 3 | EN | 10003 | 05-SEP-22 04.34.46.776463 PM |
+-----------+----+------+-------+------------------------------+
3 rows in set
obclient [SYS]> COMMIT;
obclient [SYS]> INSERT INTO ordr(id, name, value) VALUES (4,'JP', 10004);
Query OK, 1 rows affected
/* 等待较长一段时间不操作*/
obclient [SYS]> SELECT sysdate, t.* FROM ordr t;
ORA-00600: internal error code, arguments: -6210, Transaction timeout occurred, please rollback the transaction, set the variable ob_trx_timeout to a larger value and then restart the transaction
该报错信息对应的错误码信息如下:
错误码:ORA-00600
OceanBase 错误码:6210
可能原因
事务未提交超时表示事务超过了指定的阈值仍未提交。当事务超过了指定的时间还没有提交时,系统就会报错。事务未提交超时由租户变量 ob_trx_timeout 控制,默认值为 86400000000 微秒,即 24 小时。
说明
OceanBase 数据库为了避免事务长时间不提交持有锁影响其他会话,设计了两个超时逻辑:事务空闲超时和事务未提交超时。通常只会有一个超时机制会先被触发。
解决方法
请参考以下步骤,查看并修改租户变量,再通过 ROLLBACK 语句回滚并提交事务后,继续操作。
查看租户变量
ob_trx_timeout的值,确认事务超时时间是否超过了设置的值。事务的未提交超时时间阈值由租户变量
ob_trx_timeout控制,单位为微秒,建议使用默认值 24 小时(86400000000 微秒)。说明
以下设置变量的方法仅对当前会话有效,如果需要保证设置永久生效,请使用
SET GLOBAL语法配置相同变量后,再重启会话使其生效。obclient [SYS]> SHOW VARIABLES LIKE 'ob_trx_timeout'; +----------------+-----------+ | Variable_name | Value | +----------------+-----------+ | ob_trx_timeout | 100000000 | +----------------+-----------+ 1 row in set obclient [SYS]> SET SESSION ob_trx_timeout=86400000000; Query OK, 0 rows affected使用
ROLLBACK回滚事务。obclient [SYS]> ROLLBACK; Query OK, 0 rows affected执行
COMMIT提交事务。obclient [SYS]> COMMIT; Query OK, 0 rows affected再次查询
ordr表数据,操作成功。obclient [SYS]> SELECT sysdate, t.* FROM ordr t; +-----------+----+------+-------+------------------------------+ | SYSDATE | ID | NAME | VALUE | GMT_CREATE | +-----------+----+------+-------+------------------------------+ | 05-SEP-22 | 1 | CN | 10001 | 05-SEP-22 04.34.37.145469 PM | | 05-SEP-22 | 2 | US | 10002 | 05-SEP-22 04.34.46.776463 PM | | 05-SEP-22 | 3 | EN | 10003 | 05-SEP-22 04.34.46.776463 PM | +-----------+----+------+-------+------------------------------+ 3 rows in set