最近項目中使用了分布式事務,本文及接下來兩篇文章總結一下在項目中學到的知識。
分布式事務對性能有一定的影響,所以不是最佳的解決方案,能通過設計避免最好盡量避免。
分布式事務(Distributed transactions),也稱作XA事務(XA是一個協議的名字),在spring中被稱作global transaction,是指一個事務會涉及到不同的事務資源,比如不同的數據庫,消息隊列。事務資源都支持commit和rollback這樣的事務控制命令。
按是否需要實現完整javaEE功能的應用服務器,可以將實現XA事務的方法分為兩種:
1.一般情況下,XA事務是通過javaEE應用服務器實現的,即CMT(Container Managed Transaction)。應用服務器實現了JTA(Java Transaction API),應用通過JNDI獲取應用服務器的JTA UserTransaction。JTA的api比較復雜,開發者需要研究較多JTA的細節,使用spring事務管理可以簡化JTA的編程模型。但是這樣還是需要依賴實現了對應javaEE功能的應用服務器。
2.不需要應用服務器(standalone),或者只需要輕量級的應用服務器,例如tomcat,tomcat沒有實現所有的javaEE功能。在應用中加上支持jta的第三方包,例如atomikos,JOTM等。
分布式事務的結構如圖所示:
圖中,1表示APP與資源管理器RM之間的接口,是資源管理器的本地接口或者XA接口。如果使用事務管理器TM來管理分布式事務,
則不需要app直接調用rm,即1接口不會使用。
2表示app與TM的接口,即UserTransaction,這個接口和普通的事務管理接口類似,是一個有提交和回滾等操作的接口。使用該接口,就像事務只處理一個數據源一樣。app通過該接口控制事務的提交或回滾。
3是TM與RM之間的接口,是一個兩階段提交(2 phase commit)的過程,兩階段提交簡單的說就是一個數據源的事務要提交兩次才算真正提交。該操作由TM控制,app不直接調用接口3。
之后兩篇文章將分別介紹使用spring+hibernate+atomikos+tomcat實現分布式事務以及使用spring+mybatis+atomikos+tomcat實現分布式事務。
參考文獻:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#transaction
http://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html
http://www.javaworld.com/article/2076126/java-se/transaction-management-under-j2ee-1-2.html
http://www.javaworld.com/article/2077714/java-web-development/xa-transactions-using-spring.html