Envers审计表不会在使用@Transactional注释的spring-boot集成测试中回滚

问题描述 投票:0回答:1

我试图弄清楚为什么@Transactional在每次测试后都不会在envers审计表中回滚数据以及如何修复它。如何在Spring集成测试中实现这一目标?

我已经尝试过使用@DirtiesContext并使其正常工作,但这是相当的解决方法,并使测试运行的时间更长,我不喜欢。

你们有谁知道如何让它发挥作用?

spring-boot spring-test hibernate-envers spring-boot-test spring-data-envers
1个回答
0
投票

Hibernate Envers充当事务提交时审计解决方案。这最终意味着检查事务期间发生的所有持久性更改,并将一组工作单元操作缓存在内存中。简而言之,Envers将操作刷新到审计模式的唯一时间就是在提交成功事务之前。

那么从Hibernate的角度来看,这一切是如何工作的呢?

当检测到在审计实体上运行的事务,事务完成回调之前和之后,Hibernate Envers向Hibernate ORM注册2个非常关键的回调操作。之前的回调是实际执行审计更改到审计表的内容,而后者负责清理与事务相关的任何资源分配。

回调实际发生的唯一时间是要求hibernate事务协调器提交事务。如果在请求提交时已将事务标记为回滚,则跳过之前的回调。

无论事务状态如何,都会发生后回调。

看起来可能发生的是@Transactional正在创建事务边界,然后调用该方法来执行其操作,并且当该方法退出时,注释强制事务提交导致观察到的行为。

我可以为您看到一些选项:

  1. 将测试的事务行为覆盖为只读。
  2. 在验证测试用例后,设计测试以清理测试数据。
  3. 即使表中存在现有测试数据,设计测试也能正常工作。
  4. 如果不需要Envers作为集成测试的一部分,则通过配置禁用Envers。
© www.soinside.com 2019 - 2024. All rights reserved.