文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  LOCK_ORDER 工具

7.9.3 LOCK_ORDER 工具

MySQL 伺服器是一個多執行緒應用程式,它使用許多內部鎖定和與鎖定相關的原始物件,例如互斥鎖、讀寫鎖 (包括 prlock 和 sxlock)、條件和檔案。在伺服器內,與鎖定相關的物件集合會隨著新功能的實作和為提高效能而進行的程式碼重構而變更。與任何使用鎖定原始物件的多執行緒應用程式一樣,當一次持有多個鎖定時,在執行期間總是存在遇到死鎖的風險。對於 MySQL 而言,死鎖的影響是災難性的,導致服務完全中斷。

為了能夠偵測鎖定獲取死鎖並強制執行執行階段執行不受死鎖影響,MySQL 支援 LOCK_ORDER 工具。這使得鎖定順序相依圖能夠定義為伺服器設計的一部分,並且伺服器執行階段檢查能夠確保鎖定獲取是無環的,並且執行路徑符合圖表。

本節提供關於使用 LOCK_ORDER 工具的資訊,但僅限於基本層級。如需完整詳細資訊,請參閱 MySQL 伺服器 Doxygen 文件中的「鎖定順序」章節,網址為 https://mysqldev.dev.org.tw/doc/index-other.html

LOCK_ORDER 工具適用於除錯伺服器,不適用於生產用途。

若要使用 LOCK_ORDER 工具,請遵循下列程序

  1. 從原始碼建置 MySQL,使用 -DWITH_LOCK_ORDER=ON 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.plLOCK_ORDER 系統變數設定為適當的值。

所有 LOCK_ORDER 系統變數都必須在伺服器啟動時設定。在執行階段,它們的值是可見的,但無法變更。

有些系統變數會成對存在,例如 lock_order_debug_looplock_order_trace_loop。對於這類成對的變數,當它們相關聯的條件發生時,會以下列方式區分:

  • 如果啟用 _debug_ 變數,則會引發除錯斷言。

  • 如果啟用 _trace_ 變數,則會在記錄檔中印出錯誤訊息。

表 7.8 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[={OFF|ON}]
    系統變數 lock_order
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    是否在執行時啟用 LOCK_ORDER 工具。如果停用 lock_order(預設值),則其他 LOCK_ORDER 系統變數不會有任何作用。如果啟用 lock_order,則其他系統變數會設定要啟用哪些 LOCK_ORDER 功能。

    如果啟用 lock_order,當伺服器遇到未在鎖定順序圖中宣告的鎖定獲取順序時,會引發錯誤。

  • lock_order_debug_loop

    命令列格式 --lock-order-debug-loop[={OFF|ON}]
    系統變數 lock_order_debug_loop
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到被標記為鎖定順序圖中迴圈的相依性時,是否導致除錯斷言失敗。

  • lock_order_debug_missing_arc

    命令列格式 --lock-order-debug-missing-arc[={OFF|ON}]
    系統變數 lock_order_debug_missing_arc
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    當 LOCK_ORDER 工具遇到未在鎖定順序圖中宣告的相依性時,是否導致除錯斷言失敗。

  • lock_order_debug_missing_key

    命令列格式 --lock-order-debug-missing-key[={OFF|ON}]
    系統變數 lock_order_debug_missing_key
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到未透過效能架構正確檢測的物件時,是否導致除錯斷言失敗。

  • lock_order_debug_missing_unlock

    命令列格式 --lock-order-debug-missing-unlock[={OFF|ON}]
    系統變數 lock_order_debug_missing_unlock
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到在仍持有狀態下被銷毀的鎖定時,是否導致除錯斷言失敗。

  • lock_order_dependencies

    命令列格式 --lock-order-dependencies=file_name
    系統變數 lock_order_dependencies
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 檔案名稱
    預設值 空字串

    定義伺服器鎖定順序相依性圖的 lock_order_dependencies.txt 檔案路徑。

    允許不指定任何相依性。在此情況下會使用空的相依性圖。

  • lock_order_extra_dependencies

    命令列格式 --lock-order-extra-dependencies=file_name
    系統變數 lock_order_extra_dependencies
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 檔案名稱
    預設值 空字串

    包含鎖定順序相依性圖其他相依性的檔案路徑。這對於修改在 lock_order_dependencies.txt 檔案中定義的主要伺服器相依性圖非常有用,並可使用額外相依性描述第三方程式碼的行為。(另一種方法是修改 lock_order_dependencies.txt 本身,但不建議這麼做。)

    如果未設定此變數,則不會使用次要檔案。

  • lock_order_output_directory

    命令列格式 --lock-order-output-directory=dir_name
    系統變數 lock_order_output_directory
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 目錄名稱
    預設值 空字串

    LOCK_ORDER 工具寫入記錄檔的目錄。如果未設定此變數,則預設值為目前目錄。

  • lock_order_print_txt

    命令列格式 --lock-order-print-txt[={OFF|ON}]
    系統變數 lock_order_print_txt
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    是否讓 LOCK_ORDER 工具執行鎖定順序圖分析並列印文字報告。該報告包含偵測到的任何鎖定獲取迴圈。

  • lock_order_trace_loop

    命令列格式 --lock-order-trace-loop[={OFF|ON}]
    系統變數 lock_order_trace_loop
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到被標記為鎖定順序圖中迴圈的相依性時,是否在記錄檔中列印追蹤資訊。

  • lock_order_trace_missing_arc

    命令列格式 --lock-order-trace-missing-arc[={OFF|ON}]
    系統變數 lock_order_trace_missing_arc
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 ON

    LOCK_ORDER 工具遇到未在鎖定順序圖中宣告的相依性時,是否在記錄檔中列印追蹤資訊。

  • lock_order_trace_missing_key

    命令列格式 --lock-order-trace-missing-key[={OFF|ON}]
    系統變數 lock_order_trace_missing_key
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到未透過效能架構正確檢測的物件時,是否在記錄檔中列印追蹤資訊。

  • lock_order_trace_missing_unlock

    命令列格式 --lock-order-trace-missing-unlock[={OFF|ON}]
    系統變數 lock_order_trace_missing_unlock
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 ON

    LOCK_ORDER 工具遇到在仍持有狀態下被銷毀的鎖定時,是否在記錄檔中列印追蹤資訊。