分散式交易
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儲存引擎的啟動、關閉與恢複
MySQL InnoDB獨立資料表空間的配置
MySQL Server 層和 InnoDB 引擎層 體繫結構圖
InnoDB 死結案例解析
MySQL Innodb獨立資料表空間的配置