[java] 최대 절전 모드-일괄 업데이트가 업데이트에서 예기치 않은 행 수를 반환했습니다. 0 실제 행 수 : 0 예상 : 1

최대 절전 모드 오류가 발생합니다. 문제를 일으키는 기능을 식별 할 수 있습니다. 불행히도 함수에는 여러 DB 호출이 있습니다. 최대 절전 모드에서 트랜잭션 종료시 세션을 플러시하므로 문제를 일으키는 줄을 찾을 수 없습니다. 아래에 언급 된 최대 절전 모드 오류는 일반적인 오류처럼 보입니다. 어떤 Bean이 문제를 일으키는 지 언급하지 않았습니다. 이 최대 절전 모드 오류에 익숙한 사람이 있습니까?

org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
        at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
        at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransacti
onManager.java:500)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManag
er.java:473)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(Transaction
AspectSupport.java:267)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)



답변

트랜잭션에 대한 코드 및 매핑이 없으면 문제를 조사하는 것이 불가능할 것입니다.

그러나 문제의 원인을 더 잘 처리하려면 다음을 시도하십시오.

  • 최대 절전 모드 구성에서 hibernate.show_sql을 true로 설정하십시오. 실행되고 문제를 일으키는 SQL이 표시됩니다.
  • Spring과 Hibernate에 대한 로그 레벨을 DEBUG로 설정하면 다시 어느 라인이 문제를 일으키는 지 더 잘 알 수 있습니다.
  • Spring에서 트랜잭션 관리자를 구성하지 않고 문제점을 복제하는 단위 테스트를 작성하십시오. 이렇게하면 문제가되는 코드 줄을 더 잘 이해할 수 있습니다.

희망이 도움이됩니다.


답변

전혀 존재하지 않는 ID로 레코드를 삭제하는 동안 동일한 예외가 발생했습니다. 따라서 업데이트 / 삭제중인 레코드가 실제로 DB에 존재하는지 확인하십시오.


답변

솔루션 : id 속성에 대한 최대 절전 모드 매핑 파일에서 생성기 클래스를 사용하는 경우 해당 속성에 대해 setter 메서드를 사용하여 명시 적으로 값을 설정해서는 안됩니다.

Id 속성 값을 명시 적으로 설정하면 위의 오류가 발생합니다. 이 오류를 피하려면 이것을 확인하십시오. 또는 맵핑 파일에서 field generator = “native”또는 “incremental”필드를 언급하고 DATABASE에서 맵핑 된 테이블이 자동 증가하지 않습니다. 해결책 : DATABASE로 이동하여 테이블을 업데이트하여 auto_increment를 설정하십시오.


답변

일부 객체에 특정 ID를 할당 (테스트)하고 데이터베이스에 저장하려고 할 때 우연히 한 번 발생했습니다. 문제는 데이터베이스에 개체의 ID를 설정하기위한 특정 정책이 있다는 것입니다. 그냥 하지 않습니다 당신이 최대 절전 모드 수준에서 정책이있을 경우 ID를 할당합니다.


답변

필자의 경우 비슷한 두 가지 경우 에이 예외가 발생했습니다.

  • 주석이 달린 방법에서 @Transactional 에서 다른 서비스에 대한 호출이있었습니다 (긴 응답 시간). 이 메소드는 엔티티의 일부 특성을 업데이트합니다 (메소드 후에 엔티티가 여전히 데이터베이스에 존재 함). 트랜잭션 메소드에서 두 번째 종료 할 때 사용자가 메소드를 두 번 요청하면 (처음으로 작동하지 않는다고 생각하는 경우) Hibernate는 트랜잭션 시작에서 상태를 이미 변경 한 엔티티를 업데이트하려고 시도합니다. 최대 절전 모드에서는 상태의 엔터티를 검색하고 동일한 엔터티를 찾았지만 첫 번째 요청으로 이미 변경되었으므로 엔터티를 업데이트 할 수 없으므로 예외가 발생합니다. GIT의 충돌과 같습니다.
  • 엔티티를 업데이트하는 자동 요청 (플랫폼 모니터링)과 몇 초 후에 수동 롤백이있었습니다. 그러나이 플랫폼은 이미 테스트 팀에서 사용하고 있습니다. 테스터가 자동 요청과 동일한 엔티티에서 테스트를 수행하면 (100 분의 1 밀리 초 이내) 예외가 발생합니다. 이전 경우와 마찬가지로, 두 번째 트랜잭션을 종료 할 때 이전에 가져온 엔티티가 이미 변경되었습니다.

결론 : 제 경우에는 코드에서 찾을 수있는 문제가 아닙니다. 이 예외는 Hibernate가 현재 트랜잭션 중에 데이터베이스에서 처음 가져온 엔티티가 변경된 것을 발견했을 때 발생 하므로 Hibernate가 엔티티의 올바른 버전을 알 수 없으므로 데이터베이스로 플러시 할 수 없습니다 : 현재 버전 처음에 트랜잭션 가져 오기; 또는 이미 데이터베이스에 저장된 것입니다.

해결 방법 : 문제를 해결하기 위해, 당신은 최대 절전 모드로 플레이해야합니다 의 LockMode 가장 귀하의 요구 사항에 맞는 하나를 찾을 수 있습니다.


답변

방금이 문제가 발생하여 레코드를 삭제하고 나중에 Hibernate 트랜잭션에서 업데이트하려고한다는 것을 알았습니다.


답변

이는 트리거가 행 수에 영향을주는 추가 DML (데이터 수정) 쿼리를 실행할 때 발생할 수 있습니다. 내 솔루션은 트리거의 맨 위에 다음을 추가하는 것이 었습니다.

SET NOCOUNT ON;