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 的事务空闲时间表示超过一定时间没有执行语句或者没有执行提交,会自动断开连接并回滚事务,此时会话需要重新连接。
会话事务空闲超时时间阈值由租户变量 ob_trx_idle_timeout
控制,这个参数值建议使用默认值 120 秒。
下面示例先设置事务空闲超时时间为 120 秒,事务未提交超时时间为 1000 秒。当事务空闲时间超过 120 秒后,会话锁定,需要先通过 ROLLBACK
回滚事务,才能继续操作。
obclient> DROP TABLE IF EXISTS t_insert; Query OK, 0 rows affected obclient> CREATE TABLE t_insert( id bigint NOT NULL PRIMARY KEY auto_increment , name varchar(10) NOT NULL , value bigint ,gmt_create timestamp NOT NULL DEFAULT current_timestamp ); Query OK, 0 rows affected obclient> INSERT INTO t_insert(name, value) VALUES('CN',NULL),('UK',NULL),('US',NULL); Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0 obclient> SELECT now(), t.* FROM t_insert t; +---------------------+----+------+-------+---------------------+ | now() | id | name | value | gmt_create | +---------------------+----+------+-------+---------------------+ | 1970-01-01 16:54:51 | 1 | CN | NULL | 1970-01-01 16:54:49 | | 1970-01-01 16:54:51 | 2 | UK | NULL | 1970-01-01 16:54:49 | | 1970-01-01 16:54:51 | 3 | US | NULL | 1970-01-01 16:54:49 | +---------------------+----+------+-------+---------------------+ 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=now() WHERE id=3; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT now(), t.* FROM t_insert t; +---------------------+----+------+-------+---------------------+ | now() | id | name | value | gmt_create | +---------------------+----+------+-------+---------------------+ | 1970-01-01 16:55:30 | 1 | CN | NULL | 1970-01-01 16:54:49 | | 1970-01-01 16:55:30 | 2 | UK | NULL | 1970-01-01 16:54:49 | | 1970-01-01 16:55:30 | 3 | US | NULL | 1970-01-01 16:55:25 | +---------------------+----+------+-------+---------------------+ 3 rows in set <<等 120 秒不操作>> obclient> SELECT now(), t.* FROM t_insert t; ERROR 6002 (25000): transaction needs rollback obclient> ROLLBACK; Query OK, 0 rows affected obclient> SELECT now(), * FROM t_insert t; +---------------------+----+------+-------+---------------------+ | now() | id | name | value | gmt_create | +---------------------+----+------+-------+---------------------+ | 1970-01-01 16:57:43 | 1 | CN | NULL | 1970-01-01 16:54:49 | | 1970-01-01 16:57:43 | 2 | UK | NULL | 1970-01-01 16:54:49 | | 1970-01-01 16:57:43 | 3 | US | NULL | 1970-01-01 16:54:49 | +---------------------+----+------+-------+---------------------+ 3 rows in set
复制
事务未提交超时
OceanBase 的事务持续时间超过一段时间还没有提交,会报超时错误。此时会话需要明确发出 ROLLBACK
命令才可以继续在会话里执行 SQL。
会话事务的未提交超时时间阈值是由租户变量 ob_trx_timeout
控制。
下面示例先设置事务空闲超时时间为 120 秒,事务超时时间为 100 秒。当一个事务未提交时间持续到 100 秒时,事务内部状态就变为超时状态,同时锁会释放。此后会话需要显式发出 ROLLBACK
语句才能继续进行操作。
说明
建议不要将事务未提交超时参数设置小于 1 秒。
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 SEF gmt_create=sysdate() WHERE id=3; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT now(), t.* FROM t_insert t ; +---------------------+----+------+-------+---------------------+ | now() | id | name | value | gmt_create | +---------------------+----+------+-------+---------------------+ | 1970-01-01 16:59:56 | 1 | CN | NULL | 1970-01-01 16:54:49 | | 1970-01-01 16:59:56 | 2 | UK | NULL | 1970-01-01 16:54:49 | | 1970-01-01 16:59:56 | 3 | US | NULL | 1970-01-01 16:59:51 | +---------------------+----+------+-------+---------------------+ 3 rows in set <<等 100 秒不操作>> obclient> SELECT now(), t.* FROM t_insert t ; ERROR 4012 (25000): Transaction is timeout obclient> COMMIT; ERROR 4012 (25000): Transaction is timeout obclient> ROLLBACK; Query OK, 0 rows affected obclient> SELECT now(), t.* FROM t_insert t ; +---------------------+----+------+-------+---------------------+ | now() | id | name | value | gmt_create | +---------------------+----+------+-------+---------------------+ | 1970-01-01 17:04:13 | 1 | CN | NULL | 1970-01-01 16:54:49 | | 1970-01-01 17:04:13 | 2 | UK | NULL | 1970-01-01 16:54:49 | | 1970-01-01 17:04:13 | 3 | US | NULL | 1970-01-01 16:54:49 | +---------------------+----+------+-------+---------------------+ 3 rows in set
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
2502次阅读
2025-04-09 15:33:27
2025年4月国产数据库大事记:4个千万级中标项目诞生!2024年达梦净利3.6亿、金仓净利8006.6万……
墨天轮编辑部
1633次阅读
2025-04-30 17:39:54
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
659次阅读
2025-04-30 15:24:06
919万!南航信息中心采购OceanBase数据库软件许可及服务
通讯员
273次阅读
2025-04-29 16:13:34
AI关键场景得到全面支持!OceanBase入选Forrester报告三大领域代表厂商
OceanBase数据库
258次阅读
2025-04-19 22:27:54
数据库管理-第313期 分布式挑战单机,OceanBase单机版试玩(20250411)
胖头鱼的鱼缸
248次阅读
2025-04-10 22:41:56
瓜分 10 万奖金!OceanBase 首届 AI 黑客松等你来战
OceanBase数据库
242次阅读
2025-04-10 18:19:58
OceanBase单机版产品解读
多明戈教你玩狼人杀
210次阅读
2025-04-11 15:28:33
1364万!2024年中国联通软研院OceanBase扩容单一来源采购公示
通讯员
178次阅读
2025-04-21 15:55:59
OceanBase单机版保姆级安装
薛晓刚
170次阅读
2025-04-10 17:30:42