MySQL事務學習 --> 分佈式事務

轉載地址:

http://www.linuxidc.com/Linux/2013-10/91925.htm

分佈式事務

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存儲引擎的啓動、關閉與恢復 http://www.linuxidc.com/Linux/2013-06/86415.htm

MySQL InnoDB獨立表空間的配置 http://www.linuxidc.com/Linux/2013-06/85760.htm

MySQL Server 層和 InnoDB 引擎層 體系結構圖 http://www.linuxidc.com/Linux/2013-05/84406.htm

InnoDB 死鎖案例解析 http://www.linuxidc.com/Linux/2013-10/91713.htm

MySQL Innodb獨立表空間的配置 http://www.linuxidc.com/Linux/2013-06/85760.htm


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章