2013-06-22 38 views
1
  1. 我有一個EJB方法methodA(),它用TransactionAttribute.REQUIRES_NEW註釋。方法A()調用遠程服務器上運行的兩個EJB方法(可以說methodB(),methodC())(方法IIOP通信)
  2. methodB()執行少量數據庫插入操作。methodB也用TransactionAttribute.REQUIRED註釋
  3. methodC()它也被註釋爲TransactionAttribute.REQUIRED,我讓它拋出一些運行時異常來測試事務管理。
  4. 當我測試了methodA的事務管理,我發現以下..

在OpenEJB的日誌,

  1. TX REQUIRES_NEW:沒有交易暫停。EJB CMT:事務回滾不回滾持久數據

  2. TX REQUIRES_NEW:啓動的事務...... gerenimo通過TransactionImp ....從執行的methodB

  3. 日誌...完成。

  4. methodC拋出一些RuntimeException的

  5. TX REQUIRES_NEW:回滾事務...

============

即使它說事務正在回滾。通過methodA()保存的數據庫記錄仍然出現在數據庫中。我希望數據庫插入也應該回滾。

你能幫我理解可能會出錯嗎?

回答

0

問題是,方法A,B和C在不同的事務上下文中運行,因此,有三種不同的獨立事務在你的過程中獨立執行。

每個應用程序服務器都定義一個事務上下文,它由部署在同一服務器中的EJB共享。

當您調用運行在遠程服務器上的EJB時,不會使用當前事務。

如果要通過不同的遠程服務器共享相同的事務,則必須實施分佈式事務。

+0

methodB和methodC在同一臺服務器上,它們是第三方EJB ..文檔說,如果我們提供一個事務,將在執行B和C時使用。現在我該如何確保分佈式事務是從我的EJB實現的了methodA? –

+0

好的,但即使methodB()和methodC()運行在同一臺服務器上,情況也是一樣的,因爲methodA()是調用者。 如果methodB()調用methodC(),在這種情況下在C中拋出一個運行時exeption將會回滾在B中插入的數據,這是因爲它們在相同的事務上下文中運行。 說實話,分佈式事務是一個很大的話題,也許[this](http://stackoverflow.com/questions/4217270/what-is-a-distributed-transaction)可能是一個很好的起點。此外,請嘗試根據您的應用程序服務器和EJB的版本查找示例。 –

+0

感謝Gabriel,我做了一些閱讀並意識到,可能是我在OPenEJB/Websphere上運行的EJB的一面。我沒有必要做任何事情,因爲它已經是Contrainer Managed,並且沒有在我的EJB上定義的數據源(即methodA)。你知道我該如何確定遠程EJB(methodB和methodC)是否支持分佈式事務? –