2012-07-10 87 views
4

我有一個應用程序正在通過jpa對各種數據庫表進行一堆寫操作。其中一個寫入可能導致樂觀鎖定異常。如果拋出一個,這不是什麼大問題,我希望事務的其餘部分提交。Jpa事務javax.persistence.RollbackException:標記爲rollbackOnly的事務

我看了看通過對彈簧交易無回退功能:

<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> 
    <constructor-arg ref="transactionManager"/> 
    <constructor-arg ref="ignoreOptimisticLockingExceptionRule"/> 
</bean> 
<bean id="ignoreOptimisticLockingExceptionRule" class="org.springframework.transaction.interceptor.RuleBasedTransactionAttribute"> 
    <property name="rollbackRules"> 
     <list> 
      <bean class="org.springframework.transaction.interceptor.NoRollbackRuleAttribute"> 
       <constructor-arg value="javax.persistence.OptimisticLockException"/> 
      </bean> 
     </list> 
    </property> 
</bean> 
<bean class="org.springframework.orm.jpa.JpaTransactionManager" 
    id="transactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

我的應用程序捕捉周圍的實體的合併方法,將拋出此異常的OLException,但交易仍然得到回滾。我做了一些深入的研究,看看結果如何,並且在JpaTransactionManager的doCommit方法中javax.persistence.RollbackException:標記爲rollbackOnly的事務被拋出。它被拋出是因爲rollbackOnly標誌(在TransactionImpl中)被標記爲true。

深入挖掘,我看到AbstractEntityMangerImpl中的合併方法最終將事務標記爲rollbackonly,然後再觸發異常。儘管我沒有看到RuleBasedTransactionAttributes被應用到哪裏。我不知道我是否正確安裝了該設置。

謝謝!

回答

4

JPA規範要求事務在發生OptimisticLockException時標記爲回滾。我不知道你使用的JPA引擎,但至少對Hibernate(和我希望其他引擎一樣的東西),該文件說:

如果Session拋出異常,包括任何的SQLException , 立即回滾數據庫事務,調用Session.close() 並丟棄Session實例。會話的某些方法不會 使會話保持一致狀態。 沒有拋出異常Hibernate可以被視爲可恢復。通過在finally塊中調用close()來確保會話將會關閉 。

所以如果你有這樣的例外,你最好的辦法是讓事務回滾,然後重試。

+0

嗯,這有點令人失望。所以我的選擇基本上是重做一切,因爲我不太關心的輔助表具有更多的最新信息,或將兩者分開。感謝您的信息。我想我有一個替代解決方法(它是批處理邏輯,並有一個陳舊的對象導致問題)。謝謝! – tfecw 2012-07-10 18:39:52