簡體   English   中英

在Java EE中重新運行失敗的容器管理的事務

[英]Rerunning failed Container-Managed transactions in Java EE

我在使用Java EE Bean托管事務的舊系統中遇到了問題。 嘗試檢索剛剛創建的內容時,將引發LockAcquisitionException

我最初的想法是:

@TransactionAttribute(SUPPORTS)
public Item retrieveItem(int id) {
 Item i;
 try {
   i = em.find(Item.class, id);
 } catch (PersistenceException e) {
   if (e.getCause() instanceof LockAcquisitionException) {
     i = retrieveItem(id);
   }
 }
 return i;
}

但是-進行遞歸調用時,事務已經終止-並且似乎沒有創建新事務。 我嘗試了不同的TransactionAttributes ,但似乎沒有什么不同。 還嘗試自己管理事務( em.getTransaction() ),但這在CMT中是非法的。

我並不是要尋找一個優雅的解決方案-正如我所說的,這是舊的,我只需要將其分類的東西,直到幾個月后整個東西都被替換!

干杯。

嘗試注釋retrieveItem@TransactionAttribute(REQUIRES_NEW)它會接着在一個新的事務執行。

注意:

  1. 第一個無效(設置為回滾),並且永遠不會完成
  2. 在第二筆交易期間,在第一筆交易中所做的更改始終不可見

所以我不知道它是否適合您的情況。 但這是我知道的唯一操作,如果原始事務已失效,則成功進行操作。

不幸的是,我能找到的唯一方法是解決事務的原因-所以現在我在retrieveItem()的開始處執行em.flush() retrieveItem() 等不及要替換此應用了。

暫無
暫無

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

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