我有一个应用程序,通过jpa对各种数据库表进行大量写操作。其中一次写操作可能会导致乐观锁异常。如果出现此异常,不会有太大问题,我希望事务的其余部分仍能提交。
我查看了spring事务中的无回滚功能:
我的应用在实体合并方法周围捕获了OLException,但事务仍然被回滚。我进行了一些挖掘来查看情况,发现在JpaTransactionManager的doCommit方法中抛出了javax.persistence.RollbackException:事务标记为rollbackOnly。它被抛出,因为rollbackOnly标志(在TransactionImpl中)被标记为true。
深入研究后,我看到AbstractEntityMangerImpl中的合并方法最终将事务标记为rollbackonly,从而进一步触发异常。我不知道RuleBasedTransactionAttributes何时应用。我不知道我是否已正确设置它。
谢谢!
我查看了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中的合并方法最终将事务标记为rollbackonly,从而进一步触发异常。我不知道RuleBasedTransactionAttributes何时应用。我不知道我是否已正确设置它。
谢谢!