产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
参数 | 级别 | 说明 | 取值范围 | 默认值 |
tdsql_ddl_block_mode | Session | 控制普通线程(normal)DDL 锁获取行为,设置为 preemptive 时启用抢占式 DDL 逻辑 | preemptive nonblock default | preemptive |
tdsql_ddl_recovery_block_mode | Global | 控制恢复线程(recovery)DDL 锁获取行为,设置为 preemptive 时启用抢占式 DDL 逻辑;仅 GLOBAL 级别设置生效,SESSION 级别设置无效 | preemptive nonblock default | preemptive |
tdsql_ddl_preempt_after_wait_seconds | Session | 抢占式 DDL 等待 MDL‑X 锁的容忍时间,超过该时间后自动触发锁抢占流程。单位:秒 | 1 ~ 31536000 | 50 |
SET tdsql_ddl_block_mode = 'preemptive';-- tdsql_ddl_block_mode参数的默认值即为 'preemptive'
SET tdsql_ddl_preempt_after_wait_seconds = 5;
SET GLOBAL tdsql_ddl_recovery_block_mode = 'preemptive';
ALTER TABLE orders ADD COLUMN remark VARCHAR(255);
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(50));INSERT INTO t1 VALUES (1, 'Alice'), (2, 'Bob');
BEGIN;SELECT * FROM t1;-- 事务未提交,持有 t1 的 MDL 共享读锁
ALTER TABLE t1 ADD COLUMN age INT;-- 等待 MDL 排他锁...-- 超时后报错:-- ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
performance_schema.metadata_locks 定位持锁会话。BEGIN;SELECT * FROM t1;-- 事务未提交,持有 t1 的 MDL 共享读锁
SET tdsql_ddl_block_mode = 'preemptive';SET tdsql_ddl_preempt_after_wait_seconds = 5;ALTER TABLE t1 ADD COLUMN age INT;-- 等待 5 秒后,系统自动触发抢占并终止阻塞会话Query OK, 0 rows affected (5.067 sec)Records: 0 Duplicates: 0 Warnings: 0
SELECT * FROM t1;ERROR 2013 (HY000): Lost connection to MySQL server during query
SELECT * FROM performance_schema.metadata_locks WHERE OBJECT_NAME = 't1';
SELECTml.OBJECT_NAME,ml.LOCK_TYPE,ml.LOCK_STATUS,t.PROCESSLIST_ID,t.PROCESSLIST_INFOFROM performance_schema.metadata_locks mlJOIN performance_schema.threads tON ml.OWNER_THREAD_ID = t.THREAD_IDWHERE ml.OBJECT_NAME = 't1' AND ml.LOCK_STATUS = 'GRANTED';
ERROR 8542 ... Acquire object lock ... wait timeout,表明 DDL 被其他节点的 DDL 通过全局对象锁阻塞,此场景属于 DDL-DDL 冲突,需等待另一个 DDL 完成,抢占式 DDL 不适用于此场景。文档反馈