文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙尺寸) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  XA 交易的限制

15.3.8.3 XA 交易的限制

XA 交易支援僅限於 InnoDB 儲存引擎。

對於外部 XA,MySQL 伺服器充當資源管理器,而用戶端程式充當交易管理器。對於內部 XA,MySQL 伺服器內的儲存引擎充當 RM,而伺服器本身充當 TM。內部 XA 支援受到個別儲存引擎功能的限制。處理涉及多個儲存引擎的 XA 交易時,需要內部 XA。內部 XA 的實作要求儲存引擎在資料表處理常式層級支援兩階段提交,而目前僅有 InnoDB 符合此條件。

對於 XA START,會辨識 JOINRESUME 子句,但它們沒有任何作用。

對於 XA END,會辨識 SUSPEND [FOR MIGRATE] 子句,但它沒有任何作用。

在全域交易中,每個 XA 交易的 xid 值的 bqual 部分必須不同,這是目前 MySQL XA 實作的限制。它並非 XA 規格的一部分。

XA 交易會分兩部分寫入二進位日誌。當發出 XA PREPARE 時,交易的第一部分(直到 XA PREPARE)會使用初始 GTID 寫入。XA_prepare_log_event 用於識別二進位日誌中的這類交易。當發出 XA COMMITXA ROLLBACK 時,交易的第二部分(僅包含 XA COMMITXA ROLLBACK 陳述式)會使用第二個 GTID 寫入。請注意,交易的初始部分(由 XA_prepare_log_event 識別)不一定會接著它的 XA COMMITXA ROLLBACK,這可能會導致任何兩個 XA 交易的二進位日誌交錯。XA 交易的兩個部分甚至可能出現在不同的二進位日誌檔中。這表示 PREPARED 狀態的 XA 交易現在會持續存在,直到發出明確的 XA COMMITXA ROLLBACK 陳述式,從而確保 XA 交易與複寫相容。

在複本上,在準備 XA 交易後,它會立即與複寫套用程式執行緒分離,並且可以由複本上的任何執行緒提交或復原。這表示相同的 XA 交易可能會在 events_transactions_current 資料表中,在不同的執行緒上具有不同的狀態。events_transactions_current 資料表會顯示執行緒上最近監視的交易事件的目前狀態,並且在執行緒閒置時不會更新此狀態。因此,在由另一個執行緒處理後,XA 交易仍可能在原始套用程式執行緒中顯示為 PREPARED 狀態。若要明確識別仍處於 PREPARED 狀態且需要復原的 XA 交易,請使用 XA RECOVER 陳述式,而不是 Performance Schema 交易資料表。

使用 XA 交易時存在以下限制

  • 不支援將複寫篩選器或二進位日誌篩選器與 XA 交易結合使用。篩選資料表可能會導致複本上的 XA 交易為空,而且不支援空的 XA 交易。此外,由於複本的連線中繼資料儲存庫和套用程式中繼資料儲存庫儲存在 InnoDB 資料表(預設)中,因此在篩選過的 XA 交易之後,資料引擎交易的內部狀態會變更,並且可能會與複寫交易內容狀態不一致。

    無論交易是否因此為空,只要 XA 交易受到複寫篩選器的影響,就會記錄錯誤 ER_XA_REPLICATION_FILTERS。如果交易不為空,複本可以繼續執行,但您應採取步驟停止將複寫篩選器與 XA 交易搭配使用,以避免潛在問題。如果交易為空,複本會停止。在這種情況下,複本可能處於未確定的狀態,其中複寫程序的一致性可能會受到損害。尤其是,複本的複本上的 gtid_executed 集合可能與來源上的不一致。若要解決此情況,請隔離來源並停止所有複寫,然後檢查整個複寫拓樸的 GTID 一致性。復原產生錯誤訊息的 XA 交易,然後重新啟動複寫。

  • XA 交易被認為對於基於陳述式的複寫是不安全的。如果在來源上並行提交的兩個 XA 交易在複本上以相反的順序準備,則可能會發生無法安全解決的鎖定相依性,並且複寫可能因複本上的死結而失敗。這種情況可能會發生在單執行緒或多執行緒的複本上。當設定 binlog_format=STATEMENT 時,會針對 XA 交易內的 DML 陳述式發出警告。當設定 binlog_format=MIXEDbinlog_format=ROW 時,XA 交易內的 DML 陳述式會使用基於資料列的複寫來記錄,而且不會出現潛在的問題。

  • 您應該知道,當使用相同的交易 XID 循序執行 XA 交易,並且在處理 XA COMMIT ... ONE PHASE 期間發生中斷時,可能無法再同步二進位日誌與儲存引擎之間的狀態。如果上述事件系列在儲存引擎中準備好此交易之後,在 XA COMMIT 陳述式仍在執行時發生,就可能發生這種情況。這是已知問題。