tdsql_ddl_block_mode

最近更新时间:2026-05-29 10:00:56

我的收藏

功能描述

tdsql_ddl_block_mode 用于控制 DDL 操作获取 MDL 元数据锁的策略,决定 DDL 与业务查询之间的优先级关系。可选值为 preemptivenonblockdefault
当设置为 preemptive 时,代表为抢占式 DDL 模式。在该模式下,DDL 进入 MDL 等待队列后,先正常等待 tdsql_ddl_preempt_after_wait_seconds(默认为50秒)指定的时间并尝试获取排他 MDL 锁,若等待超时仍未获取到排他 MDL 锁,系统会主动 KILL 持有冲突锁的查询会话(目前仅支持抢占持有共享读锁的 SELECT 查询),随后 DDL 继续获取排他 MDL 锁并执行,后续事务保持阻塞直到 DDL 释放排他 MDL 锁。
注意:
当前并非所有类型的 DML 操作都能被抢占,目前仅支持抢占查询(SELECT)操作。
当设置为 nonblock 时,代表为无阻塞 DDL 模式。在该模式下,DDL 会以轮询重试的方式尝试获取表的排他 MDL 锁,每次以较短的超时时间(tdsql_ddl_nonblock_lock_wait_timeout,默认为1秒)等待排他 MDL 锁,若超时未获取则主动退出等待队列,不再阻塞后续新的共享锁请求。然后 sleep 一段间隔(tdsql_ddl_nonblock_retry_interval,默认为4秒)后再次尝试,最多重试 tdsql_ddl_nonblock_retry_times(默认为10)次。若某次尝试成功获取到排他 MDL 锁,则 DDL 正常执行;若所有重试均失败,则 DDL 报错返回。
当设置为 default 时,代表系统既不开启抢占式 DDL 模式,也不开启无阻塞 DDL 模式,避免这两种模式对业务造成影响。使用 MySQL 原生的 MDL 锁等待行为,即 DDL 进入等待队列后持续等待直到获取排他 MDL 锁或 lock_wait_timeout 超时。等待期间后续事务持续阻塞,不会主动终止冲突会话,也不会主动退出等待队列重试。

属性说明

属性
说明
参数类型
ENUM
默认值
preemptive
取值范围
default
preemptive
nonblock
生效范围
GLOBAL
SESSION
是否重启生效