我有以下代碼(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。
沒有足夠的信息,或者您沒有清楚地描述問題。是否有外部()btw遞歸調用? – maximdim 2010-12-17 22:08:49
我在最後添加了一個說明,其中說明了我的確切問題。 outer()遞歸調用自身,middle()也是如此。 inner()不會遞歸調用它自己。 – Pace 2010-12-17 22:28:30