想象一下,三個獨立的Spring Web應用程序在單獨的JVM和不同的機器上運行(不涉及應用程序服務器,只是簡單的servlet容器)的Java生態系統。其中兩個應用程序正在使用他們自己的使用JPA訪問的數據庫。現在,第三個應用程序(協調器)向外界提供服務,並且某些服務功能執行遠程操作,這需要其他兩個應用程序以事務方式參與,這意味着如果其中一個應用程序未能執行數據操作數據庫,另一個也應該回滾。問題是:如何使用Spring來實現?Spring Web應用程序中的分佈式事務
目前我們正在使用REST在應用程序之間進行通信。顯然這不能支持交易,即使there are efforts to make this happen。
我發現能夠組織全球交易的JTA。 JTA涉及創建參與全局管理事務的XAResource實例。如果我理解正確,這些XAResource實例可以駐留在單獨的JVM上。資源的初始化,提交和回滾通過JMS通信發生,這意味着它需要消息代理在參與者之間傳輸消息。有各種JTA實現存在,我發現Atomikos似乎是最常用的。
現在,我不明白的是,如果我在每個應用程序端都有一個Spring應用程序,所有這些都會出現。我還沒有找到任何示例項目,它正在通過網絡進行JTA。另外我不承擔什麼是XAResources代表。如果我使用JPA,並且說我在一個存儲用戶餘額的應用程序中有一個Account對象,並且我必須從協調器中減少餘額,那麼我是否應該創建允許減少餘額的XAResource實現?或者XAResource是由JDBC驅動程序或Spring Data JPA等較低級別的東西實現的?在後一種情況下,我如何爲交易協調員提供高級別的CRUD操作。
謝謝,這是有道理的。有沒有任何你知道的示例應用程序?另外我應該如何從協調員應用程序調用其他應用程序?我是否必須使用JMS正確傳播事務上下文,或者我可以使用其他方法(如Spring HTTP Invoker)? – NagyI
對不起,我現在明白,我必須通過JMS調用其他應用程序。儘管如此,一個例子會讓事情變得更加清晰。 – NagyI