標籤:就是 nbsp 開始 blank 不同 文章 oschina recover width
有時一個系統的資料 放在不同的庫之中。如果用普通的事物 一個分支庫提交成功了,另外一個分支庫提交失敗了,
這候 兩個庫沒有同步的成功或者失敗。會導致系統資料的不完整。
對於處理這種情況 MySQL有了處理分布式(XA)事物的文法
XA START xid 用於啟動一個帶給定xid的XA事物。
xid包含3個部分 gtrid,bqual,formatID
- gtrid 是一個分布式事物的標識符,一個分布式事物的每個XA事物的gtrid必須相同,這樣可以明確知道每個XA事物屬於哪個分布式事物。
- bqual 是一個分支限定符,一個分布式事物的所每個XA事物的bqual值必須不同。
- formatID 是一個數字,用於標識由gtrid和bqual值使用的格式,可以不寫 預設是1 。
分布式的關鍵在於如何確保分布式事物的完整性,以及在某個分支出現問題時的故障解決。
XA事物的相關命令就是提供給應用如何在多個獨立的資料庫之間進行分布式事物的管理,包括啟動一個分支事物,使事物進入準備階段以及事物的實際提交復原操作等。
session1 in db1 |
session2 in db2 |
xa start ‘gtridtest‘,‘bqualdb1‘ 資料庫db1中啟動一個分布式事物的一個分支 |
xa start ‘gtridtest‘,‘bqualdb2‘資料庫db2中啟動一個分布式事物的一個分支 |
update db1_table1 set content = ‘測試‘ where id =1; |
update db2_table1 set content = ‘實驗‘ where id =1; |
xa end ‘gtrid _test‘,‘bqual_db1‘ 第一階段提交 |
xa end ‘gtrid _test‘,‘bqual_db2‘ 第一階段提交 |
xa prepare ‘gtrid _test‘,‘bqual_db1‘ 進入prepare狀態 |
xa prepare ‘gtrid _test‘,‘bqual_db2‘進入prepare狀態 |
兩個事物都進入準備提交階段,如果之前遇到任何錯誤 會復原所有分支 xa recover 命令可以查看PREPARE狀態下的事物(我測試的並沒有復原。。。。) |
xa commit ‘gtrid _test‘,‘bqual_db1‘ |
xa commit ‘gtrid _test‘,‘bqual_db2‘ |
一旦開始提交操作 則需要保證全部的分支都要提交成功 如果失敗 請看文章結尾 |
如果分支事物達到prepare狀態的時,遇到斷電等異常。伺服器重新啟動之後(xa recover可以查到未完成的prepare狀態下的XA事物),可以繼續對分支 進行復原或者提交操作 ;
這麼看 其實分布式事物也不是完美的 xa事物prepare之後遇到異常不會自動復原,需要手動進行復原或者提交。
javax.transaction.xa包 是jdbc控制MySQL XA事物的API
MySQL分布式事物(XA事物)的使用