【问题标题】:Transactional in Spring test does not workSpring测试中的事务性不起作用
【发布时间】:2020-02-25 22:17:39
【问题描述】:

我在测试中使用 Spring 事务 (@Transactional)。基本上,我有一个 DAO 层,其中每个方法都有一个 @Transactional 方法。在测试类中,如果我不指定@Transactional,我可以看到数据库中的数据(所以数据被保存了),否则在类上添加@Transactional 不会持久化数据。但是,一旦测试结束,数据就会被持久化。

你知道它为什么这样做吗?

【问题讨论】:

  • 那么你会怎么做呢?我希望它刷新更改,以便我可以查看数据然后还原更改。
  • the class does not persist the data 到底是什么意思?如果您的测试是以事务方式运行的,那么在该事务提交之前,该事务的外部 将无法查看任何更改。因此,例如,如果您的测试执行INSERT INTO table (...) VALUES (...),那么尝试使用外部连接管理器/客户端(例如psql)查询状态将不会显示这些更改。但是,如果您使用正在创建这些事务的连接管理器进行查询,这些更改应该仍然可见。

标签: java spring transactions


【解决方案1】:

当您添加@Transactional 注释时,Spring 将围绕您的测试方法和@Before@After 回调启动一个新事务,当测试完成时,事务将自动回滚。

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-tx

【讨论】:

  • 我怎样才能达到我的需要?
  • 尝试在测试完成之前设置断点,直到测试事务尚未完成,此时尝试检查您在DB中的数据。
  • 例如,使用 saveAndFlush 方法。
【解决方案2】:

你的测试类的一些代码会很有帮助,所以我只能猜测......

如何将数据保存在数据库中?如果您使用Repository.save(E Entity) 方法,则更改不会刷新到数据库。它们只会保存在一级缓存中。

如果您想将数据刷新到数据库,您应该在测试类中使用TestEntityManager 并调用persistFlushFind(E entity) 方法来真正将您的实体刷新到数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多