Spring中@Transactional困惑

开始用SpringBoot和dubbo来写微服务项目。用JPA写Sql语句来更新数据库时,遇到一个问题。
@Query更新或删除时候必须要加@Modifying,@Modifying必须加上@Transactional开启事务(好像因为默认@Query中用的事务是readOnly的,@Transactional注解来启用@Transactional中的readOnly=false)。
这时,在测试用例上,因为测试完需要回滚,也加上@Transactional。
测试用例的内容是,先查询,再更新,再查询更改后的值,发现第二次查询的总是和更新前的值一样。
打断点在更新操作后,发现数据库值未变化。后查看文档,@Transactional引用默认的传播方式是在同一个事务中(应该是为了法生产错误时回滚所有操作),数据库操作的代码未提交造成的。
遂在数据库操作方法设置@Transactional(REQUIRES_NEW),运行进入更新断点,查看数据库已更新,但下一条查询操作仍然查到的是未更新的值。
有点奇怪?每个事务里看到的数据库都是不一样的,在开始事务时候的镜像吗?

17:20:25
星期日

看了参考链接的《不要在 Spring Boot 集成测试中使用 @Transactional》,似乎@Test下的@Transactional并非我理解的先更新到数据库,方法结束后回滚,其实没有真的更新到数据库也就没回滚。但如果是在内存中更新和读取,那应该也能在更新后读出来才对?

参考
测试自动回滚
不要在 Spring Boot 集成测试中使用 @Transactional
https://juejin.im/post/5dac6c...
https://juejin.im/post/5d2ac9...
https://juejin.im/post/5cfc87...
https://zhuanlan.zhihu.com/p/...

阅读 158

推荐阅读