簡體   English   中英

要求在REQUIRES_NEW內的REQUIRES_NEW內......等等

[英]REQUIRES_NEW within REQUIRES_NEW within REQUIRES_NEW … on and on

JBoss 4.x
EJB 3.0

我見過如下代碼(大大縮寫):

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class EJB1 implements IEJB1
{
   @EJB
   private IEJB1 self;

   @EJB 
   private IEJB2 ejb2;

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public boolean someMethod1()
   {
     return someMethod2();
   }

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public boolean someMethod2()
   {
     return self.someMethod3();
   }

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public boolean someMethod3()
   {
     return ejb2.someMethod1();
   }
}

並且說EJB2幾乎是EJB1的精確副本(相同的三種方法),而EJB2.someMethod3()調用EJB3.someMethod1() ,然后最終在EJB3.someMethod3()寫入DB。

這是一個人為的例子,但在我們的代碼庫中看到了類似的代碼。 代碼實際上工作得很好。

但是,感覺就像是一種糟糕的做法,而且我對每個甚至不實際執行任何數據庫寫操作的方法都關注@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 這是否實際上每次為每個方法調用創建一個新事務,結果為:

新交易
- 新交易
- 新交易
---新交易
...(還有很多)
-------新的transaciton(DB寫)

然后在那時解開? 這會不會引起性能問題? 額外的想法?

這是否實際上每次為每個方法調用創建一個新事務

不,它沒有。 只有在通過另一個bean的EJB引用調用方法時,才會創建新事務。 從同一個bean中的method1調用method2不會產生新的事務。

另見這里這里 后者是非常好的文章,解釋了EJB中的事務管理。

編輯:
感謝@korifey指出,該方法2實際上在bean引用上調用method3,從而導致新的事務。

它確實在每個EJB中創建了新的JTA事務,這必須對只讀方法(僅使SELECTS,而不是更新)產生嚴重的性能影響。 將@SUPPORTS用於只讀方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM