2011-12-13 65 views
13

當EJB的(交易)方法調用另一個(事務),另一個EJB的方法,並拋出一個異常在第二,但在第一個擦肩而過,似乎該交易將自動爲當第二個人回來時,即使第一個人回來,也會回滾,這是真的嗎?我怎樣才能避免它?EJB:避免事務回滾

的情況是以下之一:

@Stateless 
class ClassA { 
    @EJB 
    ClassB objectB; 

    methodA() { 
     try { 
      objectB.methodB(); 
     } 
     catch(Exception e) { 
      //Here the transaction started in this method is 
      //automatically rolled back. Is this avoidable? 
     } 
    } 
} 

@Stateless 
class ClassB { 
    methodB() throws Exception { throw new Exception() } 
} 

回答

19

事務回滾的情況下,你把它們具有@ApplicationException批註與rollback屬性設置爲true一個RuntimeException或任何異常,所以:

@ApplicationException(rollback=true) 
public class MyException extends Exception { 
    // ... 
} 

將回滾當前事務。

默認情況下ApplicationException的不回滾事務。

如果你不想的methodB回滾您的交易,你可以改變你的ApplicationException的回滾行爲或防止事務共享。

後者是通過改變的methodB即的TransactionAttributeRequiresNew實現的。然後,methodA事務(Tx1)將是懸而未決的,並且如果methodB拋出一個導致其事務(Tx2)回滾的異常,您仍然可以在methodA中捕獲它並阻止您的methodA事務(Tx1)的回滾。

8

是的,這是真的,如果異常是一個運行時異常。檢查異常不會導致事務回滾。

爲了避免它,只要確保在methodB代碼不拋出任何運行時異常。運行時異常通常表示錯誤或不允許繼續工作的狀態。

+0

我不好,對不起,我修改請注意,它拋出一個檢查異常,則該交易在這種情況下回滾還有問題嗎? – edutesoy

+1

不,如果異常是檢查的異常,則不應回滾。 –

+1

如果您只知道異常已被檢查,您不能說它是否會回滾您的交易。如果它是'@ApplicationException(rollback = true)',它可能會回滾你的事務。 –