Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  The LOCK_ORDER Tool

7.9.3 LOCK_ORDER 工具

MySQL 服务器是一个多线程应用程序,使用了许多内部锁和锁相关的基本原理,如互斥锁、读写锁(包括prlocks 和 sxlocks)、条件和文件。在服务器中,锁相关对象的集合随着新功能的实现和性能改进的代码重构而变化。与任何使用锁基本原理的多线程应用程序一样,在执行期间遇到死锁的风险总是存在的,对 MySQL 来说,死锁的影响是灾难性的,导致服务完全丢失。

为了检测锁获取死锁并确保运行时执行是无死锁的,MySQL 支持 LOCK_ORDER 工具。这使得可以定义服务器设计的一部分锁顺序依赖图,并在运行时检查锁获取是否是无环的,并且执行路径符合图。

本节提供了使用 LOCK_ORDER 工具的信息,但仅限于基本级别。有关完整详细信息,请参阅 MySQL 服务器 Doxygen 文档中的锁顺序部分,位于 https://dev.mysql.com/doc/index-other.html

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

要使用 LOCK_ORDER 工具,请按照以下步骤操作:

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

    Note

    启用 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 的哪些功能启用。

Note

一般来说,LOCK_ORDER 工具旨在通过执行 mysql-test-run.pl with --lock-order 选项,并让 mysql-test-run.pl 设置 LOCK_ORDER 系统变量为适当的值。

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

一些系统变量存在成对,如 lock_order_debug_looplock_order_trace_loop。对于这样的成对变量,当关联的条件发生时,它们的行为如下:

  • 如果 _debug_ 变量启用,会引发调试断言。

  • 如果 _trace_ 变量启用,将在日志中打印错误。

表 7.8 LOCK_ORDER 系统变量摘要

Variable Name Variable Type Variable Scope
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 布尔 全局

  • 锁顺序

    Command-Line Format --锁顺序[={OFF|ON}]
    System Variable 锁顺序
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔
    Default Value OFF

    是否启用 LOCK_ORDER 工具在运行时。如果 锁顺序 被禁用(默认),则其他 LOCK_ORDER 系统变量无效。如果 锁顺序 被启用,其他系统变量配置哪些 LOCK_ORDER 功能启用。

    如果 锁顺序 被启用,服务器遇到未在锁顺序图中声明的锁获取序列时将引发错误。

  • 锁顺序调试循环

    Command-Line Format --锁顺序-调试-循环[={OFF|ON}]
    System Variable 锁顺序调试循环
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔
    Default Value OFF

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

  • 锁顺序调试缺失弧

    Command-Line Format --锁顺序-调试-缺失-弧[={OFF|ON}]
    System Variable 锁顺序调试缺失弧
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔
    Default Value OFF

    是否 LOCK_ORDER 工具在遇到未在锁顺序图中声明的依赖项时引发调试断言失败。

  • 锁顺序调试缺失键

    Command-Line Format --锁顺序-调试-缺失-键[={OFF|ON}]
    System Variable 锁顺序调试缺失键
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔
    Default Value OFF

    是否 LOCK_ORDER 工具在遇到未正确 instrumented 到性能模式中的对象时引发调试断言失败。

  • 锁顺序调试缺失解锁

    Command-Line Format --锁顺序-调试-缺失-解锁[={OFF|ON}]
    System Variable 锁顺序调试缺失解锁
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔
    Default Value OFF

    是否 LOCK_ORDER 工具在遇到仍然持有的锁被销毁时引发调试断言失败。

  • 锁顺序依赖项

    Command-Line Format --锁顺序-依赖项=file_name
    System Variable 锁顺序依赖项
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 文件名
    Default Value 空字符串

    定义服务器锁顺序依赖项图的文件路径 lock_order_dependencies.txt

    允许指定无依赖项。空依赖项图将在这种情况下使用。

  • 锁顺序额外依赖项

    Command-Line Format --锁顺序-额外-依赖项=file_name
    System Variable 锁顺序额外依赖项
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 文件名
    Default Value 空字符串

    文件路径,包含锁定顺序依赖图的附加依赖项。这对于修改主服务器依赖图(定义在 lock_order_dependencies.txt 文件中)以描述第三方代码的行为非常有用。(另一种方法是修改 lock_order_dependencies.txt 文件本身,但这不被推荐。)

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

  • lock_order_output_directory

    Command-Line Format --lock-order-output-directory=dir_name
    System Variable lock_order_output_directory
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 目录名称
    Default Value 空字符串

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

  • lock_order_print_txt

    Command-Line Format --lock-order-print-txt[={OFF|ON}]
    System Variable lock_order_print_txt
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value OFF

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

  • lock_order_trace_loop

    Command-Line Format --lock-order-trace-loop[={OFF|ON}]
    System Variable lock_order_trace_loop
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value OFF

    LOCK_ORDER 工具在日志文件中是否打印跟踪信息,当它遇到锁定顺序图中的循环依赖项时。

  • lock_order_trace_missing_arc

    Command-Line Format --lock-order-trace-missing-arc[={OFF|ON}]
    System Variable lock_order_trace_missing_arc
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value ON

    LOCK_ORDER 工具在日志文件中是否打印跟踪信息,当它遇到锁定顺序图中未声明的依赖项时。

  • lock_order_trace_missing_key

    Command-Line Format --lock-order-trace-missing-key[={OFF|ON}]
    System Variable lock_order_trace_missing_key
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value OFF

    LOCK_ORDER 工具在日志文件中是否打印跟踪信息,当它遇到未正确instrumented的对象时。

  • lock_order_trace_missing_unlock

    Command-Line Format --lock-order-trace-missing-unlock[={OFF|ON}]
    System Variable lock_order_trace_missing_unlock
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value ON

    LOCK_ORDER 工具在日志文件中是否打印跟踪信息,当它遇到销毁时仍持有的锁时。