jpaを介してさまざまなデータベーステーブルに大量の書き込みを行うアプリケーションがあります。これらの書き込みの1つにより、楽観的なロック例外が発生する可能性があります。1つがスローされた場合、それは大したことではなく、トランザクションの残りの部分をコミットする必要があります。
次の方法で、春のトランザクションのロールバックなしの機能を確認しました。
<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がどこに適用されるのかわかりません。その設定が適切かどうかはわかりません。
ありがとう!