2010-12-17 53 views
3

我有以下代碼(OLE = OptimisticLockException) ...OptimisticLockException在內幕交易遺址外交易

public void outer() { 

    try { 
    middle() 
    } catch (OLE) { 
    updateEntities(); 
    outer(); 
    } 
} 

@Transactional 
public void middle() { 
    try { 
    inner() 
    } catch (OLE) { 
    updateEntities(); 
    middle(); 
} 

@Transactional 
public void inner() { 
    //Do DB operation 
} 

inner()被其他非事務方法稱爲這就是爲什麼這兩個middle()inner()是事務性的。正如你所看到的,我通過更新實體並重試操作來處理OLE。

我遇到的問題是,當我以這種方式設計事情時,我假設只有在事務關閉時才能獲得OLE。這顯然不是這種情況,因爲即使堆棧爲outer()->middle()->inner(),致電inner()也會拋出OLE。

現在,middle()正在處理OLE並且重試成功,但是當它關​​閉事務時,Spring已將其標記爲rollbackOnly。當middle()方法調用最終返回時,關閉方面拋出異常,因爲它不能提交標記爲rollbackOnly的事務。

我不確定這裏要做什麼。我無法清除rollbackOnly狀態。我不想在每次打電話給內線時強制創建交易,因爲這會殺死我的表現。我是否錯過了一些東西,或者有人能看到我可以用不同的方式構造這種結構的方式嗎

編輯:爲了澄清我在問什麼,讓我解釋我的主要問題。如果你在@Transactional方法中,是否有可能捕獲和處理OLE?

僅供參考:事務管理器是JpaTransactionManager,JPA提供者是Hibernate。

+0

沒有足夠的信息,或者您沒有清楚地描述問題。是否有外部()btw遞歸調用? – maximdim 2010-12-17 22:08:49

+0

我在最後添加了一個說明,其中說明了我的確切問題。 outer()遞歸調用自身,middle()也是如此。 inner()不會遞歸調用它自己。 – Pace 2010-12-17 22:28:30

回答

1

好吧,經過一段時間後,我想答案是否定的。任何時候你抓到一個OLE,你都必須確保你開始一個新的交易。我繼續前進,重新調整了我的代碼,以便中間不必捕捉OLE。