默认的@Transactional如何在底层运行?

时间:2018-11-22 00:34:24

标签: java spring spring-data-jpa spring-transactions jta

传播必需的默认@Transactional是否收集所有查询并在方法末尾全部执行它们,还是打开db事务并执行BEGIN,找到它的每个查询以及事务完成时执行COMMIT?

这是逻辑交易还是物理交易?

我想知道,因为我正在使用@Transactional测试执行READ_UNCOMMITED的GET端点+ DELETE端点+ GET端点,因此行为可以很好地工作,但是我发现日志中没有删除查询的痕迹,只能选择。 / p>

我本来希望看到所有发出的查询,然后回滚,但是我有一种感觉,即事务正在修改持久性上下文的托管实体,并试图在测试结束前进行保存...

如果我在执行repository.removes()时看到所有删除查询,则可能是由于某种原因冬眠只将查询从readonly = false事务中注销

1 个答案:

答案 0 :(得分:1)

也许这个答案可以帮助您:JPA flush vs commit

如果有活动事务,则JPA / Hibernate将在提交事务后执行flush方法。同时,所有应用于实体的更改都收集在Unit of Work中。

  

在flush()中,遇到刷新后,对数据的更改会反映在数据库中,但仍保留在transaction.flush()必须包含在事务上下文中,除非有必要,否则不必显式地进行操作( (在极少数情况下),当EntityTransaction.commit()为您做到这一点时。

您可以通过更改刷新策略来更改此行为。