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 버그입니까, 아니면 내가 모르는 설정입니까?