在學習分布式事務的過程中會遇到以下關鍵名詞:
相關名詞:
XA :XA規范的目的是允許多個資源(如數據庫,應用服務器,消息隊列,等等)在同一事務中訪問,這樣可以使ACID屬性跨越應用程序而保持有效。XA使用兩階段提交來保證所有資源同時提交或回滾任何特定的事務。
JTA: Java事務API(Java Transaction API,簡稱JTA ) 是一個Java企業版 的應用程序接口,在Java環境中,允許完成跨越多個XA資源的分布式事務。
分布式事務要解決的問題:
把不同支援放到一個事物中,實現ACID。舉例說明,一個方法中需要操作兩個數據庫 db1,db2, 本地事物是基於connection ,所以無法保證兩個庫的事物,這是后需要用到分布式事物。
分布式事務原理:
兩階段提交。簡單來說,引入事務管理器(txManager)的概念,開啟事務前,txManager 創建一個 tx ,txId 是全局事務的唯一標示, 方法中db1操作完成后,告知tx db1操作成功,但db1沒有真的提交,而是block住了。db2 繼續執行,執行完了自己block住,然后告知txManager,這個事物可以提交了,然后txManager 通知db1 db2 你們可以真正提交了,事物結束。
db block 住屬於第一階段, 真正提交或者回滾屬於第二階段,這就是兩階段提交。
分布式事務實現方案:
1.基於 XA和JTA 規范的,需要用到JNDI ,比較笨重。JTA 的實現方式是依賴支持jndi 的容器,資源(datasource)和管理器(txManager)都必須配置成jndi ,然后兩階段過程是在容器層面執行的,影藏了具體細節。
2.非規范實現。
spring 官方推薦的分布式事物實現方案有: Atomikos Bitronix
Atomikos 支持了XA規范和非XA:
mysql-connector.jar 驅動程序對JTA的支持: