簡體   English   中英

事務回滾后調用非事務方法

[英]Calling non-transactional method after transaction is rolled back

我剛剛發現了一些EJB行為,這對我來說似乎很令人驚訝。

這是代碼示例(確保MyBean,beanA,beanB是使用CMT的EJB):

@Stateless
public class MyBean {
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void myMethod(){
         try {
             beanA.methodA(); /* annotated as REQUIRED */
         } catch (Exception e) {
             beanB.methodB(); /* annotated as NOT_SUPPORTED */
         }
    }
}

假設methodA花費了超過事務超時的時間,因此一旦返回myMethod,它就會收到TransactionRolledbackException,然后成功將其捕獲到“ myMethod”中。

我希望到目前為止,“ methodB”將被調用,因此,根據EJB spec,必須在沒有任何事務上下文的情況下調用它。 但實際上,“ beanB”代理僅返回另一個TransactionRolledbackException,“ methodB”未執行。

查看EJB規范,我沒有發現任何證據可以證明容器應該甚至可能以這種方式運行。

我想念什么嗎? 任何提示將不勝感激。

UPDATE

至少對於Websphere,此行為似乎是特定於超時的。 例如,當“ methodA”引發RuntimeException時設置的“ rollbackOnly”標志不會阻止“ methodB”的執行。 只有超時標志可以。

EJB規范沒有專門針對這種情況,只是指出一旦將事務標記為回滾,然后“ 繼續事務是沒有結果的 ”,並且對於NOT_SUPPORTED的處理,規范表明它“ 沒有規定容器如何應該使用未指定的事務上下文來管理方法的執行 ”。

所有版本的WebSphere Application Server都采用這樣的方法來處理僅將EJB方法標記為回滾的方案的最佳方法是防止容器可以控制的所有其他操作,以便可以盡快回滾事務。盡可能確保及時釋放資源(例如數據庫鎖)。 允許調用NOT_SUPPORTED EJB方法將導致標記為回滾的事務被掛起。 因此會繼續保留可能阻止或已經阻止其他事務的資源。 因此,WebSphere阻止了這種活動。

不久前面臨類似問題。 當容器將事務標記為回滾時,此后您將無法執行任何其他EJB調用。 您可以考慮為beanA.methodA()注釋@RequiresNew的解決方案,以便它不會共享myMethod()的全局事務,並且將始終使用新事務。 因此,此新事務發生的任何事情都不會影響全局事務,因此您可以繼續進行進一步的EJB調用。

暫無
暫無

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

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