Envers 审计 table 不会在 spring 中回滚-用 @Transactional 注释的启动集成测试
Envers audit table does not rollback in spring-boot integration tests annotated with @Transactional
我想弄清楚为什么 @Transactional 在每次测试后不在 envers 审计 table 中回滚数据,以及如何修复它。
我怎样才能在 spring 集成测试中做到这一点?
我已经尝试使用@DirtiesContext,这使它工作,但它是一种解决方法,并且使测试 运行 更长,我不喜欢。
你们知道如何让它发挥作用吗?
Hibernate Envers 充当事务提交时审计解决方案。这最终意味着检查事务期间发生的所有持久性更改,并将一组工作单元操作缓存在内存中。简而言之,Envers 将操作刷新到审计模式的唯一时间是在提交成功事务之前。
那么从 Hibernate 的角度来看,这一切是如何工作的?
Hibernate Envers 在检测到在审计实体上运行的事务时向 Hibernate ORM 注册 2 个非常关键的回调操作,before 和 after 交易完成回调。 before 回调实际上执行将审计更改刷新到审计表,而 after 负责清理任何资源分配与交易有关。
before 回调实际发生的唯一时间是要求休眠事务协调器提交事务时。如果请求提交时事务已标记为回滚,则跳过 before 回调。
无论交易状态如何,after 回调总是会发生。
看起来可能发生的事情是 @Transactional
正在创建事务边界,然后调用该方法来执行其操作,当该方法退出时,注释会强制提交事务,从而导致观察到的行为。
我可以为您查看几个选项:
- 将测试的事务行为覆盖为只读。
- 设计测试以在验证测试用例后清理测试数据。
- 设计测试即使表中存在现有测试数据也能正常工作。
- 如果不需要将 Envers 作为集成测试的一部分,则通过配置禁用它。
我想弄清楚为什么 @Transactional 在每次测试后不在 envers 审计 table 中回滚数据,以及如何修复它。 我怎样才能在 spring 集成测试中做到这一点?
我已经尝试使用@DirtiesContext,这使它工作,但它是一种解决方法,并且使测试 运行 更长,我不喜欢。
你们知道如何让它发挥作用吗?
Hibernate Envers 充当事务提交时审计解决方案。这最终意味着检查事务期间发生的所有持久性更改,并将一组工作单元操作缓存在内存中。简而言之,Envers 将操作刷新到审计模式的唯一时间是在提交成功事务之前。
那么从 Hibernate 的角度来看,这一切是如何工作的?
Hibernate Envers 在检测到在审计实体上运行的事务时向 Hibernate ORM 注册 2 个非常关键的回调操作,before 和 after 交易完成回调。 before 回调实际上执行将审计更改刷新到审计表,而 after 负责清理任何资源分配与交易有关。
before 回调实际发生的唯一时间是要求休眠事务协调器提交事务时。如果请求提交时事务已标记为回滚,则跳过 before 回调。
无论交易状态如何,after 回调总是会发生。
看起来可能发生的事情是 @Transactional
正在创建事务边界,然后调用该方法来执行其操作,当该方法退出时,注释会强制提交事务,从而导致观察到的行为。
我可以为您查看几个选项:
- 将测试的事务行为覆盖为只读。
- 设计测试以在验证测试用例后清理测试数据。
- 设计测试即使表中存在现有测试数据也能正常工作。
- 如果不需要将 Envers 作为集成测试的一部分,则通过配置禁用它。