![](/img/trans.png)
[英]javax.persistence.RollbackException: Transaction marked as rollbackOnly
[英]Jpa transaction javax.persistence.RollbackException: Transaction marked as rollbackOnly
我有一個應用程序正在通過jpa對各種數據庫表進行大量寫入。 其中一個寫入可能導致樂觀鎖定異常。 如果拋出一個,這不是什么大問題,我希望事務的其余部分能夠提交。
我通過以下方式查看了spring事務的無回滾功能:
<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中的merge方法最終將事務標記為rollbackonly,然后進一步觸發異常。 我沒有看到RuleBasedTransactionAttributes應用於哪里。 我不知道我是否有正確的設置。
謝謝!
JPA規范要求在發生OptimisticLockException時將事務標記為回滾。 而且我不知道你使用哪種JPA引擎,但至少對於Hibernate而言(我希望其他引擎能做同樣的事情),文檔說:
如果Session拋出異常(包括任何SQLException),則立即回滾數據庫事務,調用Session.close()並丟棄Session實例。 Session的某些方法不會使會話保持一致狀態。 Hibernate拋出的異常都不能被視為可恢復的。 確保通過在finally塊中調用close()來關閉Session。
因此,如果您遇到此類異常,最好的辦法是讓事務回滾,然后重試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.