簡體   English   中英

Jpa事務javax.persistence.RollbackException:事務標記為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM