jpa를 통해 다양한 데이터베이스 테이블에 대한 쓰기 작업을 수행하는 응용 프로그램이 있습니다. 이러한 쓰기 중 하나가 낙관적 인 잠금 예외를 일으킬 수 있습니다. 하나가 던져지면 큰 문제가 아니며 나머지 트랜잭션을 커밋해야합니다. Jpa 트랜잭션 javax.persistence.RollbackException : 트랜잭션이 rollbackOnly로 표시되었습니다.
나는 통해 봄 거래에 노 롤백 기능에보고했다 : 이<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로 표시된 트랜잭션이 throw되는 곳입니다. TransactionImpl의 rollbackOnly 플래그가 true로 표시 되었기 때문에 throw됩니다.
더 깊게 살펴보면 AbstractEntityMangerImpl의 병합 메소드가 궁극적으로 트랜잭션을 rollbackonly로 표시하여 예외를 더 이상 트리거한다는 것을 알 수 있습니다. RuleBasedTransactionAttributes가 어디에서 적용되는지는 알 수 없습니다. 내가 제대로 설치했는지 모르겠다.
감사합니다.
흠, 그건 좀 어색해. 그래서 제 선택 사항은 기본적으로 모든 것을 다시하는 것입니다. 왜냐하면 제가 관심을 두지 않는 보조 테이블이 더 많은 최신 정보를 갖고 있거나 둘을 분리하기 때문입니다. 정보 주셔서 감사합니다. 내가 대안을 해결할 것 같아요 (그것은 논리를 배치하고 거기에 문제를 일으키는 부실 개체가 있습니다). 감사! – tfecw