1
- 我有一個EJB方法methodA(),它用TransactionAttribute.REQUIRES_NEW註釋。方法A()調用遠程服務器上運行的兩個EJB方法(可以說methodB(),methodC())(方法IIOP通信)
- methodB()執行少量數據庫插入操作。methodB也用TransactionAttribute.REQUIRED註釋
- methodC()它也被註釋爲TransactionAttribute.REQUIRED,我讓它拋出一些運行時異常來測試事務管理。
- 當我測試了methodA的事務管理,我發現以下..
在OpenEJB的日誌,
TX REQUIRES_NEW:沒有交易暫停。EJB CMT:事務回滾不回滾持久數據
TX REQUIRES_NEW:啓動的事務...... gerenimo通過TransactionImp ....從執行的methodB
日誌...完成。
methodC拋出一些RuntimeException的
TX REQUIRES_NEW:回滾事務...
============
即使它說事務正在回滾。通過methodA()保存的數據庫記錄仍然出現在數據庫中。我希望數據庫插入也應該回滾。
你能幫我理解可能會出錯嗎?
methodB和methodC在同一臺服務器上,它們是第三方EJB ..文檔說,如果我們提供一個事務,將在執行B和C時使用。現在我該如何確保分佈式事務是從我的EJB實現的了methodA? –
好的,但即使methodB()和methodC()運行在同一臺服務器上,情況也是一樣的,因爲methodA()是調用者。 如果methodB()調用methodC(),在這種情況下在C中拋出一個運行時exeption將會回滾在B中插入的數據,這是因爲它們在相同的事務上下文中運行。 說實話,分佈式事務是一個很大的話題,也許[this](http://stackoverflow.com/questions/4217270/what-is-a-distributed-transaction)可能是一個很好的起點。此外,請嘗試根據您的應用程序服務器和EJB的版本查找示例。 –
感謝Gabriel,我做了一些閱讀並意識到,可能是我在OPenEJB/Websphere上運行的EJB的一面。我沒有必要做任何事情,因爲它已經是Contrainer Managed,並且沒有在我的EJB上定義的數據源(即methodA)。你知道我該如何確定遠程EJB(methodB和methodC)是否支持分佈式事務? –