### 5.9.3 锁\_订购工具

[](<>)

MySQL 服务器是一个多线程应用程序，它使用许多内部锁定和与锁定相关的原语，例如互斥锁、rwlocks（包括 prlocks 和 sxlocks）、条件和文件。在服务器中，与锁相关的对象集会随着新功能的实现和代码重构以提高性能而发生变化。与任何使用锁定原语的多线程应用程序一样，当同时持有多个锁时，在执行期间总是存在遇到死锁的风险。对于 MySQL，死锁的影响是灾难性的，导致服务完全丢失。

从 MySQL 8.0.17 开始，为了能够检测锁获取死锁并强制运行时执行不存在死锁，MySQL 支持 LOCK\_订购工具。这使得锁定顺序依赖图能够被定义为服务器设计的一部分，并且服务器运行时检查以确保锁定获取是非循环的并且执行路径符合图。

本节提供有关使用 LOCK 的信息\_ORDER 工具，但仅限于基本级别。有关完整的详细信息，请参阅 MySQL 服务器 Doxygen 文档的锁定顺序部分，可在<https://dev.mysql.com/doc/index-other.html>.

锁\_ORDER 工具用于调试服务器，而不是用于生产用途。

使用 LOCK_ORDER 工具，请按照以下步骤操作：

1.  从源代码构建 MySQL，使用[`-DWITH_LOCK_ORDER=ON`](source-configuration-options.html#option_cmake_with_lock_order) **制作**选项，以便构建包含 LOCK\_订购工具。

    笔记

    随着[`WITH_LOCK_ORDER`](source-configuration-options.html#option_cmake_with_lock_order)启用选项，MySQL 构建需要**柔性**程序。

2.  使用 LOCK 运行服务器\_ORDER 工具启用，启用[`lock_order`](lock-order-tool.html#sysvar_lock_order)服务器启动时的系统变量。LOCK 的其他几个系统变量\_ORDER 配置也可用。

3.  对于 MySQL 测试套件操作，**mysql-test-run.pl**有个`--锁定顺序`控制是否启用 LOCK 的选项\_测试用例执行期间的 ORDER 工具。

    下面描述的系统变量配置 LOCK 的操作\_ORDER 工具，假设 MySQL 已经构建为包含 LOCK\_订购工具。主要变量是[`lock_order`](lock-order-tool.html#sysvar_lock_order), 表示是否开启LOCK\_运行时的 ORDER 工具：

-   如果[`lock_order`](lock-order-tool.html#sysvar_lock_order)已禁用（默认），没有其他 LOCK_ORDER 系统变量有任何影响。

-   如果[`lock_order`](lock-order-tool.html#sysvar_lock_order)启用，其他系统变量配置哪个LOCK\_要启用的 ORDER 功能。

笔记

一般来说，它的目的是 LOCK_ORDER 工具通过执行配置**mysql-test-run.pl**与`--锁定顺序`选项，并且对于**mysql-test-run.pl**设置锁定\_将系统变量排序为适当的值。

全部锁定\_ORDER 系统变量必须在服务器启动时设置。在运行时，它们的值是可见的，但不能更改。

一些系统变量成对存在，例如[`lock_order_debug_loop`](lock-order-tool.html#sysvar_lock_order_debug_loop)和[`lock_order_trace_loop`](lock-order-tool.html#sysvar_lock_order_trace_loop).对于这样的对，当与它们相关联的条件发生时，变量的区别如下：

-   如果`_调试_`变量被启用，调试断言被引发。

-   如果`_痕迹_`变量已启用，错误将打印到日志中。

[](<>)

**表 5.8 锁定\_ORDER 系统变量摘要**

| 变量名 | 变量类型 | 变量范围 |
| --- | ---- | ---- |
| [锁\_命令](lock-order-tool.html#sysvar_lock_order) | 布尔值 | 全球的 |
| [锁\_命令\_调试\_环形](lock-order-tool.html#sysvar_lock_order_debug_loop) | 布尔值 | 全球的 |
| [锁\_命令\_调试\_失踪\_弧](lock-order-tool.html#sysvar_lock_order_debug_missing_arc) | 布尔值 | 全球的 |
| [锁\_命令\_调试\_失踪\_钥匙](lock-order-tool.html#sysvar_lock_order_debug_missing_key) | 布尔值 | 全球的 |
| [锁\_命令\_调试\_失踪\_开锁](lock-order-tool.html#sysvar_lock_order_debug_missing_unlock) | 布尔值 | 全球的 |
| [锁\_命令\_依赖关系](lock-order-tool.html#sysvar_lock_order_dependencies) | 文件名 | 全球的 |
| [锁\_命令\_额外的\_依赖关系](lock-order-tool.html#sysvar_lock_order_extra_dependencies) | 文件名 | 全球的 |
| [锁\_命令\_输出\_目录](lock-order-tool.html#sysvar_lock_order_output_directory) | 目录名称 | 全球的 |
| [锁\_命令\_打印\_文本文件](lock-order-tool.html#sysvar_lock_order_print_txt) | 布尔值 | 全球的 |
| [锁\_命令\_痕迹\_环形](lock-order-tool.html#sysvar_lock_order_trace_loop) | 布尔值 | 全球的 |
| [锁\_命令\_痕迹\_失踪\_弧](lock-order-tool.html#sysvar_lock_order_trace_missing_arc) | 布尔值 | 全球的 |
| [锁\_命令\_痕迹\_失踪\_钥匙](lock-order-tool.html#sysvar_lock_order_trace_missing_key) | 布尔值 | 全球的 |
| [锁\_命令\_痕迹\_失踪\_开锁](lock-order-tool.html#sysvar_lock_order_trace_missing_unlock) | 布尔值 | 全球的 |

-   [](<>) [`lock_order`](lock-order-tool.html#sysvar_lock_order)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order[={OFF|ON}]` |
    | ----- | ------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order](lock-order-tool.html#sysvar_lock_order)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `离开` |

    是否开启LOCK\_运行时的 ORDER 工具。如果[`lock_order`](lock-order-tool.html#sysvar_lock_order)已禁用（默认），没有其他 LOCK_ORDER 系统变量有任何影响。如果[`lock_order`](lock-order-tool.html#sysvar_lock_order)启用，其他系统变量配置哪个LOCK\_要启用的 ORDER 功能。

    如果[`lock_order`](lock-order-tool.html#sysvar_lock_order)启用时，如果服务器遇到未在锁定顺序图中声明的锁定获取序列，则会引发错误。

-   [](<>) [`lock_order_debug_loop`](lock-order-tool.html#sysvar_lock_order_debug_loop)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-debug-loop[={OFF|ON}]` |
    | ----- | ------------------------------------ |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_debug_loop](lock-order-tool.html#sysvar_lock_order_debug_loop)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `离开` |

    是否LOCK_ORDER 工具在遇到锁定顺序图中标记为循环的依赖项时会导致调试断言失败。

-   [](<>) [`lock_order_debug_missing_arc`](lock-order-tool.html#sysvar_lock_order_debug_missing_arc)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-debug-missing-arc[={OFF|ON}]` |
    | ----- | ------------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_debug_missing_arc](lock-order-tool.html#sysvar_lock_order_debug_missing_arc)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `离开` |

    是否LOCK\_当 ORDER 工具遇到未在锁定顺序图中声明的依赖项时，会导致调试断言失败。

-   [](<>) [`lock_order_debug_missing_key`](lock-order-tool.html#sysvar_lock_order_debug_missing_key)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-debug-missing-key[={OFF|ON}]` |
    | ----- | ------------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_debug_missing_key](lock-order-tool.html#sysvar_lock_order_debug_missing_key)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `离开` |

    是否LOCK\_当 ORDER 工具遇到未正确使用 Performance Schema 检测的对象时，它会导致调试断言失败。

-   [](<>) [`lock_order_debug_missing_unlock`](lock-order-tool.html#sysvar_lock_order_debug_missing_unlock)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-debug-missing-unlock[={OFF|ON}]` |
    | ----- | ---------------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_debug_missing_unlock](lock-order-tool.html#sysvar_lock_order_debug_missing_unlock)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `离开` |

    是否LOCK_ORDER 工具在遇到仍持有时被破坏的锁时会导致调试断言失败。

-   [](<>) [`lock_order_dependencies`](lock-order-tool.html#sysvar_lock_order_dependencies)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-dependencies=file_name` |
    | ----- | ------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_dependencies](lock-order-tool.html#sysvar_lock_order_dependencies)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 文件名 |
    | 默认值 | `空字符串` |

    的路径`lock_order_dependencies.txt`定义服务器锁定顺序依赖关系图的文件。

    允许不指定依赖项。在这种情况下使用一个空的依赖图。

-   [](<>) [`lock_order_extra_dependencies`](lock-order-tool.html#sysvar_lock_order_extra_dependencies)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-extra-dependencies=file_name` |
    | ----- | ------------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_extra_dependencies](lock-order-tool.html#sysvar_lock_order_extra_dependencies)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 文件名 |
    | 默认值 | `空字符串` |

    包含锁定顺序依赖关系图的附加依赖关系的文件的路径。这对于修改主服务器依赖关系图很有用，在`lock_order_dependencies.txt`文件，具有描述第三方代码行为的附加依赖项。（另一种方法是修改`lock_order_dependencies.txt`本身，这是不鼓励的。）

    如果未设置此变量，则不使用辅助文件。

-   [](<>) [`lock_order_output_directory`](lock-order-tool.html#sysvar_lock_order_output_directory)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-output-directory=dir_name` |
    | ----- | ---------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_output_directory](lock-order-tool.html#sysvar_lock_order_output_directory)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 目录名称 |
    | 默认值 | `空字符串` |

    LOCK所在的目录\_ORDER 工具写入其日志。如果未设置此变量，则默认为当前目录。

-   [](<>) [`lock_order_print_txt`](lock-order-tool.html#sysvar_lock_order_print_txt)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-print-txt[={OFF|ON}]` |
    | ----- | ----------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_print_txt](lock-order-tool.html#sysvar_lock_order_print_txt)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `离开` |

    是否LOCK_ORDER 工具执行锁定顺序图分析并打印文本报告。该报告包括检测到的任何锁定获取周期。

-   [](<>) [`lock_order_trace_loop`](lock-order-tool.html#sysvar_lock_order_trace_loop)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-trace-loop[={OFF|ON}]` |
    | ----- | ------------------------------------ |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_trace_loop](lock-order-tool.html#sysvar_lock_order_trace_loop)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `离开` |

    是否LOCK\_当 ORDER 工具遇到在锁定顺序图中标记为循环的依赖项时，它会在日志文件中打印跟踪。

-   [](<>) [`lock_order_trace_missing_arc`](lock-order-tool.html#sysvar_lock_order_trace_missing_arc)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-trace-missing-arc[={OFF|ON}]` |
    | ----- | ------------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_trace_missing_arc](lock-order-tool.html#sysvar_lock_order_trace_missing_arc)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `在` |

    是否LOCK\_当 ORDER 工具遇到未在锁定顺序图中声明的依赖项时，它会在日志文件中打印跟踪。

-   [](<>) [`lock_order_trace_missing_key`](lock-order-tool.html#sysvar_lock_order_trace_missing_key)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-trace-missing-key[={OFF|ON}]` |
    | ----- | ------------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_trace_missing_key](lock-order-tool.html#sysvar_lock_order_trace_missing_key)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `离开` |

    是否LOCK\_当 ORDER 工具遇到未使用 Performance Schema 正确检测的对象时，它会在日志文件中打印跟踪。

-   [](<>) [`lock_order_trace_missing_unlock`](lock-order-tool.html#sysvar_lock_order_trace_missing_unlock)

    [](<>)[](<>)

    | 命令行格式 | `--lock-order-trace-missing-unlock[={OFF|ON}]` |
    | ----- | ---------------------------------------------- |
    | 介绍 | 8.0.17 |
    | 系统变量 | `[lock_order_trace_missing_unlock](lock-order-tool.html#sysvar_lock_order_trace_missing_unlock)` |
    | 范围 | 全球的 |
    | 动态的 | 不 |
    | [`SET_VAR`](optimizer-hints.html#optimizer-hints-set-var)提示适用 | 不 |
    | 类型 | 布尔值 |
    | 默认值 | `在` |

    是否LOCK\_当 ORDER 工具遇到仍持有时被破坏的锁时，它会在日志文件中打印跟踪。
