功能描述
tdsql_ddl_block_mode 用于控制 DDL 操作获取 MDL 元数据锁的策略,决定 DDL 与业务查询之间的优先级关系。可选值为 preemptive、nonblock、default。当设置为
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 |
是否重启生效 | 否 |