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';
参数说明¶
属性 |
值 |
|---|---|
变量类型 |
|
作用域 |
|
是否动态 |
是 |
默认值 |
|
可选值 |
|
单位 |
秒 |
权限¶
设置 global 变量需要
SYSTEM_VARIABLES_ADMIN或SUPER权限。设置 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 秒,以避免 单个慢事务或异常事务无限期阻塞同一行锁上的其他等待者。
锁等待超时错误会回滚整个事务而非仅超时语句。事务中此前的未提交写入会被丢弃。