文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 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 參考手冊  /  ...  /  Performance Schema 交易表

29.12.7 Performance Schema 交易表

Performance Schema 會對交易進行儀器化。在事件階層中,等待事件會巢狀於階段事件內,而階段事件會巢狀於陳述式事件內,陳述式事件則會巢狀於交易事件內。

這些表格會儲存交易事件

下列章節說明交易事件表格。也有摘要表格可彙總有關交易事件的資訊;請參閱第 29.12.20.5 節「交易摘要表格」

如需有關三個交易事件表格之間關係的詳細資訊,請參閱第 29.9 節「Performance Schema 當前與歷史事件表」

設定交易事件收集

若要控制是否收集交易事件,請設定相關儀器和消費者的狀態

  • setup_instruments 表格包含一個名為 transaction 的儀器。使用此儀器啟用或停用個別交易事件類別的收集。

  • setup_consumers 表格包含與當前和歷史交易事件表格名稱對應的名稱的消費者值。使用這些消費者篩選交易事件的收集。

預設會啟用 transaction 儀器以及 events_transactions_currentevents_transactions_history 交易消費者

mysql> SELECT NAME, ENABLED, TIMED
       FROM performance_schema.setup_instruments
       WHERE NAME = 'transaction';
+-------------+---------+-------+
| NAME        | ENABLED | TIMED |
+-------------+---------+-------+
| transaction | YES     | YES   |
+-------------+---------+-------+
mysql> SELECT *
       FROM performance_schema.setup_consumers
       WHERE NAME LIKE 'events_transactions%';
+----------------------------------+---------+
| NAME                             | ENABLED |
+----------------------------------+---------+
| events_transactions_current      | YES     |
| events_transactions_history      | YES     |
| events_transactions_history_long | NO      |
+----------------------------------+---------+

若要在伺服器啟動時控制交易事件收集,請在您的 my.cnf 檔案中使用類似以下的行

  • 啟用

    [mysqld]
    performance-schema-instrument='transaction=ON'
    performance-schema-consumer-events-transactions-current=ON
    performance-schema-consumer-events-transactions-history=ON
    performance-schema-consumer-events-transactions-history-long=ON
  • 停用

    [mysqld]
    performance-schema-instrument='transaction=OFF'
    performance-schema-consumer-events-transactions-current=OFF
    performance-schema-consumer-events-transactions-history=OFF
    performance-schema-consumer-events-transactions-history-long=OFF

若要在執行時控制交易事件的收集,請更新 setup_instrumentssetup_consumers 資料表。

  • 啟用

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'YES', TIMED = 'YES'
    WHERE NAME = 'transaction';
    
    UPDATE performance_schema.setup_consumers
    SET ENABLED = 'YES'
    WHERE NAME LIKE 'events_transactions%';
  • 停用

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'NO', TIMED = 'NO'
    WHERE NAME = 'transaction';
    
    UPDATE performance_schema.setup_consumers
    SET ENABLED = 'NO'
    WHERE NAME LIKE 'events_transactions%';

若只要針對特定的交易事件資料表收集交易事件,請啟用 transaction instrument,但僅啟用對應所需資料表的交易 consumer。

關於設定事件收集的更多資訊,請參閱第 29.3 節,「Performance Schema 啟動設定」,以及第 29.4 節,「Performance Schema 執行階段設定」

交易邊界

在 MySQL Server 中,交易會明確地以這些陳述式開始

START TRANSACTION | BEGIN | XA START | XA BEGIN

交易也會隱含地開始。例如,當啟用 autocommit 系統變數時,每個陳述式的開始都會開始一個新的交易。

autocommit 停用時,在已提交交易之後的第一個陳述式會標記新交易的開始。後續陳述式屬於該交易的一部分,直到該交易被提交為止。

交易會明確地以這些陳述式結束

COMMIT | ROLLBACK | XA COMMIT | XA ROLLBACK

交易也會隱含地結束,透過執行 DDL 陳述式、鎖定陳述式以及伺服器管理陳述式。

在以下討論中,對 START TRANSACTION 的參考也適用於 BEGINXA STARTXA BEGIN。同樣地,對 COMMITROLLBACK 的參考也分別適用於 XA COMMITXA ROLLBACK

Performance Schema 定義交易邊界的方式與伺服器類似。交易事件的開始和結束與伺服器中對應的狀態轉換密切匹配。

  • 對於明確開始的交易,交易事件會在處理 START TRANSACTION 陳述式期間開始。

  • 對於隱含開始的交易,交易事件會在先前交易結束後,第一個使用交易引擎的陳述式上開始。

  • 對於任何交易,無論是明確還是隱含結束,當伺服器在處理 COMMITROLLBACK 期間轉換出作用中交易狀態時,交易事件就會結束。

這種方法有一些細微的含義

  • Performance Schema 中的交易事件並未完全包含與對應的 START TRANSACTIONCOMMITROLLBACK 陳述式相關聯的陳述式事件。交易事件和這些陳述式之間存在微不足道的時間重疊。

  • 使用非交易引擎的陳述式不會影響連線的交易狀態。對於隱含交易,交易事件會從第一個使用交易引擎的陳述式開始。這表示即使在 START TRANSACTION 之後,僅對非交易資料表進行操作的陳述式也會被忽略。

為了說明,請考慮以下情境

1. SET autocommit = OFF;
2. CREATE TABLE t1 (a INT) ENGINE = InnoDB;
3. START TRANSACTION;                       -- Transaction 1 START
4. INSERT INTO t1 VALUES (1), (2), (3);
5. CREATE TABLE t2 (a INT) ENGINE = MyISAM; -- Transaction 1 COMMIT
                                            -- (implicit; DDL forces commit)
6. INSERT INTO t2 VALUES (1), (2), (3);     -- Update nontransactional table
7. UPDATE t2 SET a = a + 1;                 -- ... and again
8. INSERT INTO t1 VALUES (4), (5), (6);     -- Write to transactional table
                                            -- Transaction 2 START (implicit)
9. COMMIT;                                  -- Transaction 2 COMMIT

從伺服器的角度來看,當建立資料表 t2 時,交易 1 會結束。交易 2 要等到存取交易資料表時才會開始,儘管在中間有對非交易資料表的更新。

從 Performance Schema 的角度來看,當伺服器轉換為作用中交易狀態時,交易 2 會開始。陳述式 6 和 7 不會包含在交易 2 的邊界內,這與伺服器將交易寫入二進位記錄的方式一致。

交易檢測

三個屬性定義交易

為了降低交易檢測的複雜性並確保收集的交易資料提供完整、有意義的結果,所有交易都會獨立於存取模式、隔離層級或 autocommit 模式進行檢測。

若要選擇性地檢查交易歷史記錄,請使用交易事件資料表中的屬性欄:ACCESS_MODEISOLATION_LEVELAUTOCOMMIT

可以透過各種方式降低交易檢測的成本,例如根據使用者、帳戶、主機或執行緒(用戶端連線)啟用或停用交易檢測。

交易和巢狀事件

交易事件的父項是啟動交易的事件。對於明確開始的交易,這包括 START TRANSACTIONCOMMIT AND CHAIN 陳述式。對於隱含開始的交易,它是先前交易結束後第一個使用交易引擎的陳述式。

一般來說,交易是交易期間啟動的所有事件的最高層父項,包括明確結束交易的陳述式,例如 COMMITROLLBACK。例外情況是隱含結束交易的陳述式,例如 DDL 陳述式,在這種情況下,必須先提交目前的交易,然後才能執行新的陳述式。

交易和預存程式

交易和預存程式事件的關係如下

  • 預存程序

    預存程序獨立於交易運作。預存程序可以在交易內開始,並且可以從預存程序內開始或結束交易。如果從交易內呼叫,預存程序可以執行強制提交父交易的陳述式,然後開始新的交易。

    如果預存程序在交易內開始,則該交易是預存程序事件的父項。

    如果交易由預存程序開始,則預存程序是交易事件的父項。

  • 預存函式

    預存函式受到限制,無法導致明確或隱含的提交或回滾。預存函式事件可以存在於父交易事件內。

  • 觸發程序

    觸發程序會啟動為存取與其關聯的資料表之陳述式的一部分,因此觸發程序事件的父項始終是啟動它的陳述式。

    觸發程序無法發出導致明確或隱含的交易提交或回滾的陳述式。

  • 排程事件

    在新的連線中執行排程事件主體中的陳述式。排程事件在父交易內巢狀是不適用的。

交易和儲存點

儲存點陳述式會記錄為單獨的陳述式事件。交易事件包含交易期間發出的 SAVEPOINTROLLBACK TO SAVEPOINTRELEASE SAVEPOINT 陳述式的個別計數器。

交易和錯誤

交易內發生的錯誤和警告會記錄在陳述式事件中,而不是記錄在對應的交易事件中。這包括特定於交易的錯誤和警告,例如在非交易資料表上的回滾或 GTID 一致性錯誤。