2010-06-30 49 views
1

我有使用Java EE Bean管理事務的舊系統的情況。當它試圖檢索剛剛創建的東西時,它會拋出LockAcquisitionException在Java EE中重新運行容器管理的事務失敗

我最初的想法是這樣的:

@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中是非法的。

我不是在尋找一個優雅的修正 - 正如我所說,這是傳統的,我只是需要的東西,將它類選,直到整個事情得到在一兩個月的更換!

乾杯。

回答

0

不幸的是,我可以找到這樣做的唯一方法是修復交易的原因 - 所以現在我在retrieveItem()開頭做了em.flush()。等不及要取代這個程序..

1

嘗試使用@TransactionAttribute(REQUIRES_NEW)註釋retrieveItem:它將在新事務中執行。

需要注意的是:

  1. 第二交易期間,第一個是已經無效(回滾套),絕不會完全
  2. ,在第一個事務造成的變化是不可見反正

所以我不知道它是否適合你的情況。但是,如果原始交易已失效,這是我知道進行操作併成功提交的唯一方法。

+0

謝謝..試過了,但它仍然是不工作...我不能完全肯定它拿起註解,因爲我得到一個「交易不活躍」的錯誤。 :( – 2010-07-01 08:53:24

+0

@Robert威爾遜我的錯誤,我忽略了你使用BMT的事實。你可以嘗試注入'UserTransaction',並用它來啓動/停止一個新的,而不是'em.getTransaction'? – ewernli 2010-07-01 12:46:23