2014-08-27 5 views
0

DBUnit을 사용하여 실행할 때 SQLServer DB에 대해 실행하면 예상대로 작동하는 간단한 트랜잭션 격리 테스트가 있습니다.DBUnit을 사용하여 트랜잭션 격리 수준을 설정하는 방법

@Test 
@com.google.inject.persist.Transactional 
public void testFreeze() { 
    try { 
    EntityManager applicationManagedEntityManager = entityMangerFactoryProvider.get().createEntityManager(); 
    EntityManager guiceManagedEntityManager = entityManager.get(); 

    Person p = new Person("Fred"); 
    guiceManagedEntityManager.persist(p);//But not committed 
    guiceManagedEntityManager.flush();//* Note 

    runQuery(guiceManagedEntityManager, "select count(*) from Person");//Works just fine 
    runQuery(applicationManagedEntityManager, "select count(*) from Person");//Hangs when running this query using DBUnit 
    applicationManagedEntityManager.close(); 
    } 
    catch (Exception err) { 
    err.printStackTrace(); 
    } 
} 

private void runQuery(final EntityManager entityManager, final String query) { 
    entityManager.createQuery(query).getSingleResult(); 
    //Or try running it as below 
    //Session session = entityManager.unwrap(Session.class); 
    //session.doWork(new Work() { 
    // @Override 
    // public void execute(Connection connection) throws SQLException { 
    // connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 
    // entityManager.unwrap(Session.class).createSQLQuery(query).uniqueResult(); 
    // } 
    //}); 
} 

참고 : 현실에서 발생할 수있는 일을 시뮬레이션하기 위해 여기에 인위적인 플러시가 있습니다. '사람'에 대한 추가 쿼리를 실행하면 플러시가 발생할 수 있습니다.

SQL Server는 예상대로 작동합니다. persistence.xml ("hibernate.connection.isolation"을 "1"로 설정)에서 READ_COMMIT를 설정하거나 주석 처리 된 코드 에서처럼 해당 연결에 대해 즉시 변경하면 테스트가 완료됩니다. 그러나 DBUnit에 대해 동일한 테스트를 실행하면 모든 경우에 중단됩니다. DBUnit 버그입니까, 아니면 내가 모르는 설정입니까?

답변

0

이 문제는 실제로 HSQLDB (2.3.2)와 관련이 있습니다. READ_UNCOMMITTED 트랜잭션 격리 수준을 지원하지 않습니다. 여기에서 This post은 자세한 내용을 제공합니다.

관련 문제