java - Jpa 事务 javax.persistence.RollbackException : Transaction marked as rollbackOnly

标签 java spring jpa

我有一个应用程序正在通过 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: Transaction marked as rollbackOnly 的地方。它被抛出是因为 rollbackOnly 标志(在 TransactionImpl 中)被标记为 true。

深入研究,我看到 AbstractEntityMangerImpl 中的合并方法最终将事务标记为 rollbackonly,然后进一步触发异常。我看不到 RuleBasedTransactionAttributes 在哪里应用。我不知道我是否正确设置了该设置。

谢谢!

最佳答案

JPA 规范要求在发生 OptimisticLockException 时将事务标记为回滚。而且我不知道您使用的是哪个 JPA 引擎,但至少对于 Hibernate(我希望其他引擎也有同样的事情),文档说:

If the Session throws an exception, including any SQLException, immediately rollback the database transaction, call Session.close() and discard the Session instance. Certain methods of Session will not leave the session in a consistent state. No exception thrown by Hibernate can be treated as recoverable. Ensure that the Session will be closed by calling close() in a finally block.

因此,如果出现此类异常,最好的办法是让事务回滚,然后重试。

关于java - Jpa 事务 javax.persistence.RollbackException : Transaction marked as rollbackOnly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11418290/

相关文章:

java - 不知道我的算法使用什么数据结构

java - 将 Python 项目重写为 Java——值得吗?

java - java数组索引越界

jpa - 在 JBoss/WildFly 中,我应该在数据源上启用 JTA 以与 JPA 一起使用吗?

java - 如何用CustomView替换工具栏标题

java - Spring Batch JdbcBatchItemWriter

java - Spring Security,多个http元素。哪个是哪个?

java - 应用程序创建数据库,但不创建表

java - 使用集合更新实体的 JPA 最佳实践

mysql - Eclipse JPA (MySQL) 自动生成位字段到字节,我可以让它生成位到 bool 值吗