---
title: "关于事务超时 | OceanBase 文档中心"
description: 关于事务超时 OceanBase 数据库为了避免事务长时间不提交持有锁影响其他会话，设计了两个超时逻辑。一个是事务空闲超时，一个是事务未提交超时。 背景信息 OceanBase 数据库设计的事务空闲超时和事务未提交超时，分别由变量 ob_trx_idle_timeout 和 ob_trx_timeout 控制，默认值…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# 关于事务超时

更新时间：2023-07-19 13:03:06

OceanBase 数据库为了避免事务长时间不提交持有锁影响其他会话，设计了两个超时逻辑。一个是事务空闲超时，一个是事务未提交超时。

## 背景信息

OceanBase 数据库设计的事务空闲超时和事务未提交超时，分别由变量 [ob_trx_idle_timeout](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000354854) 和 [ob_trx_timeout](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000354856) 控制，默认值分别是 120 秒和 100 秒。通常只会有一个超时机制会先被触发。

可以通过以下命令查看当前参数配置：

```sql
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` 回滚事务，才能继续操作。

```sql
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

```

## 事务未提交超时

OceanBase 的事务持续时间超过一段时间还没有提交，会报超时错误。此时会话需要明确发出 `ROLLBACK` 命令才可以继续在会话里执行 SQL。

会话事务的未提交超时时间阈值是由变量 `ob_trx_timeout` 控制。

#### 说明

建议不要将事务未提交超时参数设置小于 1 秒。

**示例 2：** 先设置事务空闲超时时间为 120 秒，事务超时时间为 100 秒。当一个事务未提交时间持续到 100 秒时，事务内部状态就变为超时状态，同时锁会释放。此后会话需要显式发出 `ROLLBACK` 语句才能继续进行操作。

```sql
obclient> SET session ob_trx_timeout=100000000;
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.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

```

## 相关文档

- [ob_trx_idle_timeout](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000354854)
 - [ob_trx_timeout](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000354856)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
