標籤:本地 pytho 產生 0.00 nsa 引擎 本地事務 重啟 lan
XA事務簡介
XA 交易的基礎是兩階段交易認可協議。需要有一個事務協調者來保證所有的事務參與者都完成了準備工作(第一階段)。如果協調者收到所有參與者都準備好的訊息,就會通知所有的事務都可以提交了(第二階段)。MySQL 在這個XA事務中扮演的是參與者的角色,而不是協調者(交易管理員)。
mysql 的XA事務分為內部XA和外部XA。 外部XA可以參與到外部的分散式交易中,需要應用程式層介入作為協調者;內部XA事務用於同一執行個體下跨多引擎事務,由Binlog作為協調者,比如在一個儲存引擎提交時,需要將提交資訊寫入二進位日誌,這就是一個分布式內部XA事務,只不過二進位日誌的參與者是MySQL本身。 Mysql 在XA事務中扮演的是一個參與者的角色,而不是協調者。
MySQL XA 交易基本文法
XA {START|BEGIN} xid [JOIN|RESUME] 啟動一個XA事務 (xid 必須是一個唯一值; [JOIN|RESUME] 字句不被支援)
XA END xid [SUSPEND [FOR MIGRATE]] 結束一個XA事務 ( [SUSPEND [FOR MIGRATE]] 字句不被支援)
XA PREPARE xid 準備
XA COMMIT xid [ONE PHASE] 提交XA事務
XA ROLLBACK xid 復原XA事務
XA RECOVER 查看處於PREPARE 階段的所有XA事務
事務標識符xid
xid 是一個事務標識符,它由用戶端提供或者有mysql伺服器產生。
xid的格式一般為 xid : gtrid [, bqual [, formatID]] ;gtrid是一個全域事務標識符,bqual是一個分支限定符,formatID是一個數字,用於標識由gtrid和bqual值使用的格式。根據文法的表示,bqual和formatID是自選的。如果沒有給定,預設的bqual值是‘‘。如果沒有給定,預設的fromatID值是1。
XA事務狀態進展過程
1. 使用XA START 啟動一個XA事務,並把它置為ACTIVE狀態。
2. 對一個ACTIVE XA事務,發布構成事務的SQL語句,然後發布一個XA END 語句,XA END 把事務置為IDLE狀態。
3. 對一個IDLE XA 交易, 發布一個XA PREPARE語句或者一個XA COMMIT ... ONE PHASE語句: 前者把事務置為PREPARE狀態,此時XA RECOVER 語句的輸出包含事務的xid值(XA RECOVER 語句會列出所有處於PREPARE狀態的XA事務); 後者用於預備和提交事務,不會被XA RECOVER列出,因為事務已經終止。
4. 對一個PREPARE XA 交易,發行就緒一個XA COMMIT語句來提交和終止事務,或者發布一個XA ROLLBACK 來復原並終止事務。
簡單的XA事務操作流程
[plain] view plain copy print?
- mysql> XA START ‘xatest‘;
- Query OK, 0 rows affected (0.00 sec)
-
- mysql> INSERT INTO test (name,tel) VALUES (‘123‘,‘123‘);
- Query OK, 1 row affected (0.00 sec)
-
- mysql> XA END ‘xatest‘;
- Query OK, 0 rows affected (0.00 sec)
-
- mysql> XA PREPARE ‘xatest‘;
- Query OK, 0 rows affected (0.00 sec)
-
- mysql>
- mysql>
- mysql> XA COMMIT ‘xatest‘;
- Query OK, 0 rows affected (0.00 sec)
XA RECOVER 介紹
XA RECOVER 列出所有處於PREPARE狀態的XA事務:
[python] view plain copy print?
- mysql> XA RECOVER;
- +----------+--------------+--------------+--------+
- | formatID | gtrid_length | bqual_length | data |
- +----------+--------------+--------------+--------+
- | 1 | 6 | 0 | xa1000 |
- +----------+--------------+--------------+--------+
- 1 row in set (0.00 sec)
注釋:
1. formatID 是事務xid的formatID部分。
2. gtrid_length 是xid的gtrid部分的長度,以位元組為單位。
3. bqual_length 是xid的bqual部分的長度,以位元組為單位。
4. data 是xid的gtrid部分和bqual部分的串聯。
在用一個用戶端環境下,XA事務和本地(非XA)事務互斥,如果已經發布了XA START來開啟一個事務,則本地事務不會被啟動,知道XA事務被提交或者被復原為止;相反的,如果已經使用START TRANSACTION啟動一個本地事務,則XA語句不能被使用,直到該事務被提交或者復原為止,而且XA事務僅僅被InnoDB儲存引擎支援。
如果XA事務達到PREPARE狀態時MySQL伺服器宕機,當伺服器重啟後,伺服器會復原任何未完成的XA事務,即使該事務已經達到了PREPARE狀態;如果用戶端串連終止,而伺服器繼續運行,伺服器將復原任何未完成的XA事務,即使該事務已經達到PREPARED狀態。
Mysql資料庫分散式交易XA詳解