10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.6 mb
PDF (A4)- 41.7 mb
手册页(TGZ)- 262.2 kb
手册页(邮政编码)- 372.3 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

5.9.3 LOCK_ORDER工具

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

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

本节提供关于使用LOCK_ORDER工具的信息,但只提供基本级别的信息。要了解完整的细节,请参阅MySQL Server Doxygen文档的Lock Order部分10bet官方网站https://dev.10bet靠谱mysql.com/doc/index-other.html

LOCK_ORDER工具用于调试服务器,而不是用于生产。

要使用LOCK_ORDER工具,请遵循以下步骤:

  1. 从源代码构建MySQL,使用-DWITH_LOCK_ORDER =对CMake选项,以便构建包含LOCK_ORDER工具。

    请注意

    WITH_LOCK_ORDER选项启用后,MySQL构建需要flex程序。

  2. 要在启用LOCK_ORDER工具的情况下运行服务器,请启用lock_order服务器启动时的系统变量。LOCK_ORDER配置的其他几个系统变量也可用。

  3. MySQL测试套件操作,mysql-test-run.pl有一个——lock-order选项,它控制在测试用例执行期间是否启用LOCK_ORDER工具。

下面描述的系统变量是LOCK_ORDER工具的配置操作,假设MySQL已经被构建为包含LOCK_ORDER工具。主要变量是lock_order,指示是否在运行时启用LOCK_ORDER工具:

  • 如果lock_order禁用(默认值),则没有其他LOCK_ORDER系统变量有任何影响。

  • 如果lock_order,则其他系统变量配置要启用哪些LOCK_ORDER特性。

请注意

通常,我们希望通过执行LOCK_ORDER工具来配置mysql-test-run.pl——lock-order选项,mysql-test-run.pl将LOCK_ORDER系统变量设置为适当的值。

所有LOCK_ORDER系统变量必须在服务器启动时设置。在运行时,它们的值是可见的,但不能更改。

有些系统变量是成对存在的,例如lock_order_debug_loop而且lock_order_trace_loop.对于这样的对,当与它们相关的条件发生时,变量被区分如下:

  • 如果_debug_变量时,将引发一个调试断言。

  • 如果_trace_变量,则将错误打印到日志中。

表5.7 LOCK_ORDER系统变量汇总

变量名 变量类型 变量作用域
lock_order 布尔 全球
lock_order_debug_loop 布尔 全球
lock_order_debug_missing_arc 布尔 全球
lock_order_debug_missing_key 布尔 全球
lock_order_debug_missing_unlock 布尔 全球
lock_order_dependencies 文件名称 全球
lock_order_extra_dependencies 文件名称 全球
lock_order_output_directory 目录名称 全球
lock_order_print_txt 布尔 全球
lock_order_trace_loop 布尔 全球
lock_order_trace_missing_arc 布尔 全球
lock_order_trace_missing_key 布尔 全球
lock_order_trace_missing_unlock 布尔 全球

  • lock_order

    命令行格式 ——lock-order[={|在}]
    介绍了 8.0.17
    系统变量 lock_order
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

    是否在运行时启用LOCK_ORDER工具。如果lock_order禁用(默认值),则没有其他LOCK_ORDER系统变量有任何影响。如果lock_order,则其他系统变量配置要启用哪些LOCK_ORDER特性。

    如果lock_order启用时,如果服务器遇到没有在锁定顺序图中声明的锁定获取序列,则会引发错误。

  • lock_order_debug_loop

    命令行格式 ——lock-order-debug-loop[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_debug_loop
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

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

  • lock_order_debug_missing_arc

    命令行格式 ——lock-order-debug-missing-arc[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_debug_missing_arc
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

    当LOCK_ORDER工具遇到没有在锁顺序图中声明的依赖项时,它是否会导致调试断言失败。

  • lock_order_debug_missing_key

    命令行格式 ——lock-order-debug-missing-key[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_debug_missing_key
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

    当LOCK_ORDER工具遇到没有正确使用Performance Schema检测的对象时,它是否会导致调试断言失败。

  • lock_order_debug_missing_unlock

    命令行格式 ——lock-order-debug-missing-unlock[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_debug_missing_unlock
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

    当LOCK_ORDER工具遇到在仍然持有时被销毁的锁时,它是否会导致调试断言失败。

  • lock_order_dependencies

    命令行格式 ——lock-order-dependencies = file_name
    介绍了 8.0.17
    系统变量 lock_order_dependencies
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 文件名称
    默认值 空字符串

    通往天堂之路lock_order_dependencies.txt定义服务器锁顺序依赖关系图的文件。

    它不允许指定任何依赖项。在本例中使用了一个空的依赖关系图。

  • lock_order_extra_dependencies

    命令行格式 ——lock-order-extra-dependencies = file_name
    介绍了 8.0.17
    系统变量 lock_order_extra_dependencies
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 文件名称
    默认值 空字符串

    包含用于锁顺序依赖关系图的附加依赖关系的文件的路径。方法中定义的主服务器依赖关系图非常有用lock_order_dependencies.txt文件,带有描述第三方代码行为的附加依赖项。(另一种选择是修改lock_order_dependencies.txt本身,这是不鼓励的。)

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

  • lock_order_output_directory

    命令行格式 ——lock-order-output-directory = dir_name
    介绍了 8.0.17
    系统变量 lock_order_output_directory
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 目录名称
    默认值 空字符串

    LOCK_ORDER工具写入其日志的目录。如果未设置此变量,则默认为当前目录。

  • lock_order_print_txt

    命令行格式 ——lock-order-print-txt[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_print_txt
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

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

  • lock_order_trace_loop

    命令行格式 ——lock-order-trace-loop[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_trace_loop
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

    LOCK_ORDER工具在遇到被标记为锁顺序图中的循环的依赖项时,是否在日志文件中打印跟踪。

  • lock_order_trace_missing_arc

    命令行格式 ——lock-order-trace-missing-arc[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_trace_missing_arc
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

    LOCK_ORDER工具在遇到没有在锁顺序图中声明的依赖项时,是否在日志文件中打印跟踪。

  • lock_order_trace_missing_key

    命令行格式 ——lock-order-trace-missing-key[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_trace_missing_key
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

    当LOCK_ORDER工具遇到没有正确使用Performance Schema检测的对象时,它是否在日志文件中打印跟踪。

  • lock_order_trace_missing_unlock

    命令行格式 ——lock-order-trace-missing-unlock[={|在}]
    介绍了 8.0.17
    系统变量 lock_order_trace_missing_unlock
    范围 全球
    动态 没有
    SET_VAR提示应用 没有
    类型 布尔
    默认值

    LOCK_ORDER工具在遇到仍然持有的锁被销毁时是否在日志文件中打印跟踪。