【问题标题】:Spring @Transactional: Rollback information reported but not actually performedSpring @Transactional:回滚信息已报告但未实际执行
【发布时间】:2011-04-07 22:00:10
【问题描述】:

我已将我的测试类注释如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:WebContent/WEB-INF/applicationContext.xml", "file:WebContent/WEB-INF/context-aspects.xml"})
@Transactional
public class MyTest {

}

但是,在执行测试时,测试数据库突然充满了值,尽管启用了@Transactional 并且我可以在日志中读取以下内容:

INFO: Began transaction (4): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@669aa3f3]; rollback [true]
07.04.2011 23:57:33 org.springframework.test.context.transaction.TransactionalTestExecutionListener endTransaction
INFO: Rolled back transaction after test execution for test context ...

任何想法为什么不执行测试用例后的实际回滚?

更新:如果我使用的是 HSQLDB,我没有这些问题 - 那是不是 mysql 的问题?

【问题讨论】:

  • 你用的是什么数据库引擎?
  • 如果是 MySQL,您使用哪种类型:MyISAM 还是 InnoDB?
  • 我正在使用 MySQL InnoDB。在另一个项目中,它使用相同的数据库,但我无法弄清楚配置的差异在哪里。

标签: java unit-testing spring testing junit


【解决方案1】:

更新:如果我使用的是 HSQLDB,我没有这些问题 - 那么是 mysql 的问题吗?

是的,你是对的。

检查您是否使用了正确的方言(使用 Hibernate 时:org.hibernate.dialect.MySQL5InnoDBDialect),并且可能您应该监控发送到数据库的语句。

【讨论】:

    【解决方案2】:

    我终于可以解决问题了。 Hibernate 正在生成显然没有事务支持的 MyISAM 表。这是由于配置了错误的休眠方言。我用了 org.hibernate.dialect.MySQL5Dialect,但 org.hibernate.dialect.MySQL5InnoDBDialect 是必需的。

    【讨论】:

      猜你喜欢
      • 2020-01-14
      • 1970-01-01
      • 2017-04-14
      • 2020-06-12
      • 2018-11-08
      • 1970-01-01
      • 2013-06-17
      • 2017-09-30
      • 2016-12-11
      相关资源
      最近更新 更多