主动终止空闲事务
操作场景
当一个事务长时间空闲且不提交,执行回滚操作时,会对数据库的资源和性能造成损耗。如果有大量的空闲事务长期不执行也不提交,在业务高峰期的时候发生回滚,性能损耗会较为严重。TaurusDB支持主动终止空闲事务,可针对不同类型的事务(只读事务、读写事务)用不同的参数进行控制,当空闲事务超时后会被自动的回滚并断开连接。
- 读写事务:事务中执行了INSERT、UPDATE、DELETE等写操作。
- 只读事务:事务中仅执行了SELECT查询,或使用START TRANSACTION READ ONLY显式开启。
什么是空闲
一条连接的生命周期是在“等待客户端发送命令”和“执行客户端命令”之间交替进行的,空闲即服务端正在等待客户端发送下一条命令。 SQL 正在执行期间,无论执行耗时多久,都不属于"空闲",不会被任何空闲超时机制断开。
TaurusDB具备两层空闲超时机制,连接空闲超时和事务空闲超时。
| 分类 | 控制参数 | 适用场景 | 说明 | 超时后的行为 |
|---|---|---|---|---|
| 连接空闲超时 | 连接上未开启事务,或不在事务中。 | 通用机制,任何连接空闲超过此时间都会被断开。 | 断开连接。 | |
| 事务空闲超时 |
| 连接上存在未提交的活动事务。 | 事务中的空闲连接相较于普通连接具有更高的资源占用风险:
因此在连接空闲超时基础上,TaurusDB提供事务空闲超时机制,对处于事务中的连接提供更短的超时控制。 | 超时触发后,服务端会执行以下操作:
|
| 对比项 | idle_transaction_timeout系列 | wait_timeout /interactive_timeout |
|---|---|---|
| 适用场景 | 连接上存在未提交的活动事务。 | 所有连接,不区分是否在事务中。 |
| 默认值 | 0(不生效,需显式设置)。 | 28800秒(8 小时)。 |
| 超时值 | 可按只读/读写分别设置更短的超时值。 | 不区分事务类型,统一超时值。 |
| 超时行为 | 断开连接,未提交事务自动回滚。 | 断开连接,未提交事务自动回滚。 |
| 优先级 | 处于事务中时,idle_*transaction_timeout 系列值优先于 wait_timeout。 | 作为基础超时值,事务空闲超时值不超过此值。 |
前提条件
内核版本为2.0.39.230300及以后的版本支持该功能。内核版本的查询方法请参见如何查看云数据库 TaurusDB实例的版本号。
约束限制
- 三个参数默认均为0,即默认不启用空闲事务超时,需要显式设置才会生效。
- 超时触发后,未提交事务自动回滚,客户端无法收到友好的错误提示,仅收到 ERROR 2013。
- 参数为 SESSION 级别,可针对不同会话设置不同的超时策略,也可在 GLOBAL 级别统一设置。
- 事务超时后数据回滚不可恢复,请在业务侧做好重试机制。
- 建议对读写事务设置更短的超时时间,读写事务持有锁资源,长时间空闲对其他事务影响更大。
- 空闲超时只计算等待命令的时间,SQL 正在执行期间不会触发空闲超时,无论执行多久。
- 事务空闲超时值不会超过wait_timeout,如果设置的idle_transaction_timeout大于wait_timeout,实际生效值仍为wait_timeout。
参数介绍
show variables like '%idle%'; +------------------------------------+------+ | Variable_name | Value | +-----------------------------------+-------+ | idle_readonly_transaction_timeout | 0 | | idle_transaction_timeout | 0 | | idle_write_transaction_timeout | 0 | +-----------------------------------+-------+
| 参数名 | 级别 | 参数描述 |
|---|---|---|
| idle_readonly_transaction_timeout | global、session | 控制只读事务连接的超时时间,单位为秒。 参数设置为0时不生效,即表示只读事务连接的超时时间没有限制。 |
| idle_transaction_timeout | global、session | 控制一般空闲事务连接的超时时间,单位为秒。 参数设置为0时不生效,即表示一般空闲事务的连接超时时间没有限制。 |
| idle_write_transaction_timeout | global、session | 控制读写事务连接的超时时间,单位为秒。 参数设置为0时不生效,即表示读写事务连接的超时时间没有限制。 |
上述三个参数不是独立校验的,而是按优先级逐级检查。
- idle_readonly_transaction_timeout和idle_write_transaction_timeout的优先级高于idle_transaction_timeout。
- 若idle_readonly_transaction_timeout或idle_write_transaction_timeout为0,继续校验idle_transaction_timeout。若idle_transaction_timeout=0,则该类型事务不启用空闲事务超时。
- 上述三个参数均为 0,则不启用空闲事务超时,空闲事务不会因此被终止。
| idle_readonly_transaction_timeout | idle_write_transaction_timeout | idle_transaction_timeout | 只读事务超时 | 读写事务超时 |
|---|---|---|---|---|
| > 0 | > 0 | 任意 | idle_readonly_transaction_timeout生效 | idle_write_transaction_timeout生效 |
| > 0 | = 0 | > 0 | idle_readonly_transaction_timeout生效 | idle_transaction_timeout生效 |
| > 0 | = 0 | = 0 | idle_readonly_transaction_timeout生效 | 不生效 |
| = 0 | > 0 | > 0 | idle_transaction_timeout生效 | idle_write_transaction_timeout生效 |
| = 0 | > 0 | = 0 | 不生效 | idle_write_transaction_timeout生效 |
| = 0 | = 0 | > 0 | idle_transaction_timeout生效 | idle_transaction_timeout生效 |
| = 0 | = 0 | = 0 | 不生效 | 不生效 |