1. 程式人生 > >MySQL事務學習 -- 分散式事務

MySQL事務學習 -- 分散式事務

               

7 分散式事務

Innodb儲存引擎支援XA事務,通過XA事務可以支援分散式事務的實現。分散式事務指的是允許多個獨立的事務資源(transac         tional resources)參與一個全域性的事務中。事務資源通常是關係型資料庫系統,也可以是其它型別的資源。

全域性事務要求在其中所有參與的事務要麼全部提交,要麼全部回滾,這對於事務原有的ACID要求又有了提高。另外,在使用分散式事務時候,InnoDB儲存引擎的事務隔離級別必須設定成serialiable。

XA事務允許不同資料庫之間的分散式事務,如:一臺伺服器是mysql資料庫,一臺是oracle的,又有可能還有一臺是sqlserver的,只要參與全域性事務中的每個節點都支援XA事務。分散式事務可能在銀行系統的轉帳中比較常見,如一個使用者需要從上海轉1000元到北京的一個使用者賬號上面:

# bank ofshanghai:

Updateuser_account set money=money – 10000 where user=’xiaozhang’;

# bank ofBeijing:

Updateuser_account set money= money + 10000 where user=’xiaoli’;

像這種情況一定需要分散式的事務,要不都提交,要麼都回滾。在任何一個節點出問題都會造成嚴重的結果:1 xiaozhang的帳號被扣款,但是xiaoli沒有收到錢;2 xiaozhang的帳號沒有被扣款,但是xiaoli收到錢了。

分散式事務是由一個或者多個Resource Managerd,一個事務管理器Transaction Manager以及一個應用程式 Application Program組成。

資源管理器:提供訪問事務資源的方法,通常一個數據庫就是一個資源管理器。

事務管理器:協調參與全域性事務中的各個事務。需要和參與全域性事務中的資源管理器進行通訊。

應用程式:定義事務的邊界,指定全域性事務中的操作。

在mysql中的分散式事務中,資源管理器就是mysql資料庫,事務管理器為連線到mysql伺服器的客戶端。如下圖所示:


分散式事務使用兩段式提交(two-phase commit)的方式。在第一個階段,所有參與全域性事務的節點都開始準備,告訴事務管理器它們準備好提交了。第二個階段,事務管理器告訴資源管理器執行rollback或者commit,如果任何一個節點顯示不能commit,那麼所有的節點就得全部rollback。

當前的java的jta java transaction API可以很好的支援mysql的分散式事務,可以仔細參考jta手冊。下面的例子顯示瞭如何使用jta支援呼叫mysql分散式事務。

引數innodb_support_xa可以檢視是否啟用了XA事務支援(預設為on開啟狀態):

mysql> show variables like'innodb_support%';+-------------------+-------+| Variable_name     | Value |+-------------------+-------+| innodb_support_xa | ON    |+-------------------+-------+1 row in set (0.00 sec) mysql>


[注意] 對於XA事務的支援,是在mysql體系結構的儲存引擎層。因此即使不參與外部的XA事務,mysql事務內部不同儲存引擎也會使用xa事務。假設我們用start  transaction開啟了一個本地的事務,往NDB Cluster儲存引擎的表t1插入一條記錄,往innodb儲存引擎的表t2插入一條記錄,然後commit,在mysql內部也是通過xa事務來進行協調的,這樣才可以保證2張表的原子性。