2016-08-27 4 views
1

Spring + Hibernate + SQLite 스택에서 롤백에 실패한 트랜잭션에 문제가 있습니다. 두 개의 필드 (ID와 이름) 와 POJO - 여기 Spring + Hibernate + SQLite 트랜잭션 oddities

는 구성 http://pastebin.com/XbejGHft
  • TestBeanhttp://pastebin.com/3BSFy34p
  • 주문 기업 내 예를

    • 주석 응용 프로그램의 주요 클래스입니다

      는 방법 TestBean.testMethod()

      public void testMethod() { 
          entityManager.persist(createOrder("1")); 
          entityManager.persist(createOrder("2")); 
          entityManager.persist(createOrder("3")); 
          entityManager.createQuery("from Order").getResultList(); 
          entityManager.persist(createOrder("4")); 
          throw new RuntimeException("Managed"); 
      } 
      

      그것은 생성하고 일부 주문 엔티티를 계속 본다. 일부 생성물 사이에 데이터베이스에서 일부 데이터를 읽습니다. 결국 메소드 호출 중에 실패를 시뮬레이트하고 Spring to rollback 트랜잭션을 강제 실행하기 위해 RuntimeException을 던집니다.

      실행 후 나는 마지막으로 생성 된 엔티티 (createOrder ("4"))와 다른 모든 (이름이 "1", "2"및 "3"인) completley 롤백이 데이터베이스를 열어 볼 수 있습니다. 데이터베이스 그러나 TestBean은 @Transactional로 표시되기 때문에 하나의 트랜잭션 메소드 testMethod()에서 생성 된 네 개의 엔티티를 모두 제거해야합니다.

      SQLIte에서 모든 journal_mode를 시도했지만 롤백이 여전히 작동하지 않습니다.

      아이디어가 있으십니까?

  • +0

    Hibernate는 ** ** em.persist() ** 호출마다 ** JdbcIsolationDelegate # delegateWork **를 호출하는 것 같습니다. 동시에 ** JdbcIsolationDelegate # delegateWork ** 호출 ** Connection # commit ** 메소드는 JPA/Hibernate 프레임 워크에서 모든 트랜잭션 상호 작용을 중단시킵니다. – Joltd

    답변

    0

    오랫동안 나는 문제의 진정한 원인을 찾았습니다. 응용 프로그램의 모든 엔티티에 대한 @GeneratedValue 주석의 전략 유형입니다.

    기본적으로 어노테이션은 전략이 AUTO이고, 이는 Hibernate가 ID 값을 생성하기 위해 목표 데이터베이스 (hibernate_sequence)에서 자체 테이블을 사용할 것임을 의미합니다. Hibernate는 별도의 트랜잭션 (hibernate_sequence로부터 현재 값 선택)에서 질의를 호출한다 -이 시점에서 우리는 문제에 직면했다.

    하이버 네이트가 하이버네이션보다 새로운 멀티 커넥션 데이터 소스를 사용하지만 SQLite는 액티브 커넥션을 하나만 가질 수있다. "데이터베이스 파일이 잠겨있다"라는 오류가 발생한다. 커넥션을 막는 Spring의 SingleConnectionDataSource을 사용하면 Hibernate는 기존 연결을 재사용하지만 새로운 별도의 트랜잭션을 생성합니다. 새 트랜잭션이 성공적으로 완료되지만 새 ID를 요청한 이전 트랜잭션은 실패합니다.

    그래서 해결책은 매우 간단합니다, 그냥 모든 당신의 실체가이 경우에 Hibernate는 기본 데이터베이스에 ID 값의 생성을 위임합니다, 그래서

    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    

    같은 주석이 있는지 확인하십시오.

    관련 문제