基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
关于事务超时
更新时间:2023-07-19 13:03:06
OceanBase 数据库为了避免事务长时间不提交持有锁影响其他会话,设计了两个超时逻辑。一个是事务空闲超时,一个是事务未提交超时。
背景信息
OceanBase 数据库设计的事务空闲超时和事务未提交超时,分别由变量 ob_trx_idle_timeout 和 ob_trx_timeout 控制,默认值分别是 120 秒和 100 秒。通常只会有一个超时机制会先被触发。
可以通过以下命令查看当前参数配置:
obclient> SHOW variables WHERE variable_name IN ('ob_trx_idle_timeout','ob_trx_timeout');
+---------------------+-----------+
| VARIABLE_NAME | VALUE |
+---------------------+-----------+
| ob_trx_idle_timeout | 120000000 |
| ob_trx_timeout | 100000000 |
+---------------------+-----------+
2 rows in set
事务空闲超时
OceanBase 的事务空闲时间表示超过一定时间没有执行语句或者没有执行提交,需要通过 ROLLBACK 回滚事务后,才能继续操作。
会话事务空闲超时时间阈值由变量 ob_trx_idle_timeout 控制。
示例 1: 先设置事务空闲超时时间为 120 秒,事务未提交超时时间为 1000 秒。当事务空闲时间超过 120 秒后,会话锁定,需要先通过 ROLLBACK 回滚事务,才能继续操作。
obclient> CREATE TABLE t_insert(
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> INSERT INTO t_insert(id, name, value) values(1,'CN',NULL),(2,'UK',NULL),(3,'US',NULL);
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
obclient> SELECT sysdate, t.* FROM t_insert t;
+-----------+----+------+-------+------------------------------+
| SYSDATE | ID | NAME | VALUE | GMT_CREATE |
+-----------+----+------+-------+------------------------------+
| 01-JAN-70 | 1 | CN | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 2 | UK | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 3 | US | NULL | 01-JAN-70 04.45.31.513542 PM |
+-----------+----+------+-------+------------------------------+
3 rows in set
obclient> SET session ob_trx_timeout=1000000000;
Query OK, 0 rows affected
obclient> SET session ob_trx_idle_timeout=120000000;
Query OK, 0 rows affected
obclient> BEGIN;
Query OK, 0 rows affected
obclient> UPDATE t_insert SET gmt_create=sysdate WHERE id=3;
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
obclient> SELECT sysdate, t.* FROM t_insert t;
+-----------+----+------+-------+------------------------------+
| SYSDATE | ID | NAME | VALUE | GMT_CREATE |
+-----------+----+------+-------+------------------------------+
| 01-JAN-70 | 1 | CN | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 2 | UK | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 3 | US | NULL | 01-JAN-70 04.54.09.000000 PM |
+-----------+----+------+-------+------------------------------+
3 rows in set
<<等 120 秒不操作>>
obclient> SELECT sysdate, t.* FROM t_insert t;
ORA-24761: transaction rolled back: transaction needs rollback
obclient> ROLLBACK;
Query OK, 0 rows affected
obclient> SELECT sysdate, t.* FROM t_insert t;
+-----------+----+------+-------+------------------------------+
| SYSDATE | ID | NAME | VALUE | GMT_CREATE |
+-----------+----+------+-------+------------------------------+
| 01-JAN-70 | 1 | CN | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 2 | UK | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 3 | US | NULL | 01-JAN-70 04.45.31.513542 PM |
+-----------+----+------+-------+------------------------------+
3 rows in set
事务未提交超时
OceanBase 的事务持续时间超过一段时间还没有提交,会报超时错误。此时会话需要明确发出 ROLLBACK 命令才可以继续在会话里执行 SQL。
会话事务的未提交超时时间阈值是由变量 ob_trx_timeout 控制。
说明
建议不要将事务未提交超时参数设置小于 1 秒。
示例 2: 先设置事务空闲超时时间为 120 秒,事务超时时间为 100 秒。当一个事务未提交时间持续到 100 秒时,事务内部状态就变为超时状态,同时锁会释放。此后会话需要显式发出 ROLLBACK 语句才能继续进行操作。
obclient> SET session ob_trx_timeout=100000000;
Query OK, 0 rows affected
obclient> SET session ob_trx_idle_timeout=120000000;
Query OK, 0 rows affected
obclient> BEGIN;
Query OK, 0 rows affected
obclient> UPDATE t_insert SET gmt_create=sysdate WHERE id=3;
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
obclient> SELECT sysdate, t.* FROM t_insert t;
+-----------+----+------+-------+------------------------------+
| SYSDATE | ID | NAME | VALUE | GMT_CREATE |
+-----------+----+------+-------+------------------------------+
| 01-JAN-70 | 1 | CN | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 2 | UK | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 3 | US | NULL | 01-JAN-70 04.59.48.000000 PM |
+-----------+----+------+-------+------------------------------+
3 rows in set
<<等 100 秒不操作>>
obclient> SELECT sysdate, t.* FROM t_insert t;
ORA-00600: internal error code, arguments: -6210, Transaction is timeout
obclient> COMMIT;
ORA-00600: internal error code, arguments: -6210, Transaction is timeout
obclient> ROLLBACK;
Query OK, 0 rows affected
obclient> SELECT sysdate, t.* FROM t_insert t;
+-----------+----+------+-------+------------------------------+
| SYSDATE | ID | NAME | VALUE | GMT_CREATE |
+-----------+----+------+-------+------------------------------+
| 01-JAN-70 | 1 | CN | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 2 | UK | NULL | 01-JAN-70 04.45.31.513542 PM |
| 01-JAN-70 | 3 | US | NULL | 01-JAN-70 04.45.31.513542 PM |
+-----------+----+------+-------+------------------------------+
3 rows in set