2012-07-10 4 views
4

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가 어디에서 적용되는지는 알 수 없습니다. 내가 제대로 설치했는지 모르겠다.

감사합니다.

답변

4

JPA 스펙은 OptimisticLockException이 발생할 때 트랜잭션이 롤백으로 표시되도록 요구합니다. 그리고 나는 그러나 적어도 최대 절전 모드를 들어, 당신이 사용하는 JPA 엔진 모르는 (그리고 나는 다른 엔진 같은 일을 예상), 문서는 말한다 : 세션이 SQLException이 포함 예외가 발생

경우 , 즉시 데이터베이스 트랜잭션을 롤백하고 Session.close() 을 호출하고 Session 인스턴스를 삭제합니다. Session의 특정 메소드는 세션을 일관된 상태로 두지 않습니다. 에 의해 던진 예외 없음 최대 절전 모드는 복구 가능으로 처리 될 수 있습니다. finally 블록에서 close()를 호출하여 세션을 으로 닫아야합니다.

그래서 예외가 발생하면 가장 좋은 방법은 트랜잭션 롤백을 허용하고 다시 시도하는 것입니다.

+0

흠, 그건 좀 어색해. 그래서 제 선택 사항은 기본적으로 모든 것을 다시하는 것입니다. 왜냐하면 제가 관심을 두지 않는 보조 테이블이 더 많은 최신 정보를 갖고 있거나 둘을 분리하기 때문입니다. 정보 주셔서 감사합니다. 내가 대안을 해결할 것 같아요 (그것은 논리를 배치하고 거기에 문제를 일으키는 부실 개체가 있습니다). 감사! – tfecw

관련 문제