lock_wait_timeout

控制在悲观事务中,一条语句等待获取行级锁的最大秒数。超时后,服务器返回错误 20710 Lock wait timeout exceeded; try restarting transaction 并回滚整个当前事务。

说明

lock_wait_timeout 设置悲观事务中的语句等待获取另一事务持有的行级锁的最长时间, 以秒为单位。仅在 SELECT ... FOR UPDATE 或 DML 语句在悲观事务中需要行级锁时 生效。

当等待超时而仍未获得锁时,MatrixOne 返回错误 20710(ErrLockWaitTimeout), 错误消息为 “Lock wait timeout exceeded; try restarting transaction”,并 回滚整个当前事务。

语法

在全局或会话级别设置 lock_wait_timeout

SET GLOBAL lock_wait_timeout = 120;
SET SESSION lock_wait_timeout = 5;
SET lock_wait_timeout = 5;  -- 等同于 SET SESSION

查询当前值:

SELECT @@global.lock_wait_timeout;
SELECT @@session.lock_wait_timeout;
SELECT @@lock_wait_timeout;
SHOW VARIABLES LIKE 'lock_wait_timeout';

参数说明

属性

变量类型

int

作用域

GlobalSession

是否动态

默认值

120

可选值

131536000

单位

权限

  • 设置 global 变量需要 SYSTEM_VARIABLES_ADMINSUPER 权限。

  • 设置 session 变量无需特殊权限。

示例

DROP DATABASE IF EXISTS lock_wait_timeout_demo;
CREATE DATABASE lock_wait_timeout_demo;
USE lock_wait_timeout_demo;

-- 查看默认值
SELECT @@global.lock_wait_timeout, @@session.lock_wait_timeout;

-- 将会话超时改为 5 秒
SET SESSION lock_wait_timeout = 5;
SELECT @@session.lock_wait_timeout;

DROP DATABASE lock_wait_timeout_demo;

注意事项

  • 从 v4.1.4 开始,默认值从 31536000(约 1 年,几乎无限制)调整为 120 秒,以避免 单个慢事务或异常事务无限期阻塞同一行锁上的其他等待者。

  • 锁等待超时错误会回滚整个事务而非仅超时语句。事务中此前的未提交写入会被丢弃。