如何使用 DBUnit 设置事务隔离级别

Posted

技术标签:

【中文标题】如何使用 DBUnit 设置事务隔离级别【英文标题】:How to set transaction isolation level with DBUnit 【发布时间】:2014-08-27 11:29:46 【问题描述】:

我在下面有一个简单的事务隔离测试,如果我针对我的 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 错误,还是有我不知道的设置?

【问题讨论】:

【参考方案1】:

问题实际上与 HSQLDB (2.3.2) 有关。它不支持 READ_UNCOMMITTED 事务隔离级别。 This post 此处提供了更多详细信息。

【讨论】:

以上是关于如何使用 DBUnit 设置事务隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 四种事务隔离级的说明[转]

如何确认当前事务的隔离级别

Django ORM 中的每个事务隔离级别

事务的隔离级别和mysql事务隔离级别修改

MySQL 是如何实现四大隔离级别的

SQL Server 事务隔离级别详解