Performance Schema 會檢測交易。在事件階層中,等待事件會巢狀於階段事件內,階段事件會巢狀於陳述式事件內,陳述式事件會巢狀於交易事件內。
這些表格會儲存交易事件
events_transactions_current
:每個執行緒的目前交易事件。events_transactions_history
:每個執行緒已結束的最近交易事件。events_transactions_history_long
:全域(跨所有執行緒)已結束的最近交易事件。
以下章節說明交易事件表格。還有摘要表格會彙總交易事件的相關資訊;請參閱章節 29.12.20.5,「交易摘要表格」。
如需關於三個交易事件表格之間關係的詳細資訊,請參閱章節 29.9,「Performance Schema 用於目前和歷史事件的表格」。
設定交易事件收集
若要控制是否收集交易事件,請設定相關工具和消費者的狀態
表格包含一個名為setup_instruments
的儀器 (instrument)。使用這個儀器可以啟用或停用個別交易事件類別的收集。transaction
表格包含消費者 (consumer) 值,其名稱對應於目前和歷史的交易事件表格名稱。使用這些消費者來篩選交易事件的收集。setup_consumers
儀器和 transaction
以及 events_transactions_current
交易消費者預設為啟用。events_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_instruments
表格。setup_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
關於設定事件收集的更多資訊,請參閱 第 29.3 節,「Performance Schema 啟動設定」和 第 29.4 節,「Performance Schema 執行階段設定」。
交易邊界
在 MySQL 伺服器中,交易會透過下列語句明確開始:
START TRANSACTION | BEGIN | XA START | XA BEGIN
交易也會隱含地開始。例如,當啟用
系統變數時,每個語句的開始都會開始一個新的交易。autocommit
當停用
時,在已提交的交易之後的第一個語句會標示為新交易的開始。後續的語句是交易的一部分,直到它被提交。autocommit
交易會透過下列語句明確結束:
COMMIT | ROLLBACK | XA COMMIT | XA ROLLBACK
交易也會隱含地結束,透過執行 DDL 語句、鎖定語句和伺服器管理語句。
在以下討論中,對
的引用也適用於 START TRANSACTION
、BEGIN
和 XA START
。類似地,對 XA BEGIN
和 COMMIT
的引用適用於 ROLLBACK
和 XA COMMIT
。XA ROLLBACK
Performance Schema 定義的交易邊界與伺服器的定義類似。交易事件的開始和結束與伺服器中的相應狀態轉換密切匹配。
對於明確開始的交易,交易事件會在處理
語句期間開始。START TRANSACTION
對於隱含開始的交易,交易事件會在先前交易結束後,使用交易引擎的第一個語句開始。
對於任何交易,無論是明確還是隱含結束,交易事件會在伺服器在處理
或COMMIT
期間轉換出使用中的交易狀態時結束。ROLLBACK
這種方法有一些微妙的含義:
Performance Schema 中的交易事件並未完全包含與相應
、START TRANSACTION
或COMMIT
語句相關聯的語句事件。交易事件和這些語句之間有微量的時間重疊。ROLLBACK
使用非交易引擎的語句對連線的交易狀態沒有影響。對於隱含交易,交易事件會從使用交易引擎的第一個語句開始。這表示即使在
之後,專門對非交易表格操作的語句也會被忽略。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
從伺服器的角度來看,當建立表格
時,交易 1 結束。在存取交易表格之前,交易 2 不會開始,儘管在中間對非交易表格進行了更新。t2
從 Performance Schema 的角度來看,當伺服器轉換為使用中交易狀態時,交易 2 開始。語句 6 和 7 未包含在交易 2 的邊界內,這與伺服器將交易寫入二進位記錄的方式一致。
交易儀器
有三個屬性定義交易:
存取模式(唯讀、讀寫)
隔離級別(
、SERIALIZABLE
等)REPEATABLE READ
隱含 (啟用
) 或明確 (停用autocommit
)autocommit
為了降低交易儀器的複雜性,並確保收集的交易資料提供完整、有意義的結果,所有交易都會獨立於存取模式、隔離級別或自動提交模式進行儀器化。
若要選擇性地檢查交易歷史記錄,請使用交易事件表格中的屬性欄:
、ACCESS_MODE
和 ISOLATION_LEVEL
。AUTOCOMMIT
可以透過各種方式降低交易儀器的成本,例如根據使用者、帳戶、主機或執行緒(用戶端連線)啟用或停用交易儀器。
交易和巢狀事件
交易事件的父系是啟動該交易的事件。對於明確開始的交易,這包含
和 START TRANSACTION
語句。對於隱含開始的交易,它是先前交易結束後,使用交易引擎的第一個語句。COMMIT AND CHAIN
一般而言,交易是交易期間啟動的所有事件的頂層父系,包括明確結束交易的語句,例如
和 COMMIT
。例外情況是隱含結束交易的語句,例如 DDL 語句,在這種情況下,必須在執行新語句之前提交目前的交易。ROLLBACK
交易和預存程式
交易和預存程式事件的關係如下:
預存程序
預存程序獨立於交易運作。可以在交易內啟動預存程序,並且可以從預存程序內開始或結束交易。如果從交易內呼叫,預存程序可以執行強制提交父系交易然後開始新交易的語句。
如果預存程序在交易內啟動,則該交易是預存程序事件的父系。
如果交易由預存程序啟動,則預存程序是交易事件的父系。
預存函數
預存函數受到限制,無法導致明確或隱含提交或回滾。預存函數事件可以駐留在父系交易事件中。
觸發器
觸發器會作為存取與其關聯的表格之語句的一部分啟用,因此觸發器事件的父系始終是啟用它的語句。
觸發器無法發出導致明確或隱含提交或回滾交易的語句。
排程事件
在新的連線中執行排程事件主體中的語句。在父系交易內巢狀排程事件不適用。
交易和儲存點
儲存點語句會記錄為個別的語句事件。交易事件包含在交易期間發出的
、SAVEPOINT
和 ROLLBACK TO SAVEPOINT
語句的個別計數器。RELEASE SAVEPOINT
交易和錯誤
在交易中發生的錯誤和警告會記錄在語句事件中,而不是在對應的交易事件中。這包括特定於交易的錯誤和警告,例如在非交易表格上回滾或 GTID 一致性錯誤。