一、功能描述
·当设置为 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 |
| 取值范围 | defaultpreemptivenonblock |
| 生效范围 | GLOBALSESSION |
| 是否重启生效 | 否 |