传播所需的默认 @Transactional 是否会收集所有查询并在方法末尾完全执行它们,还是打开一个数据库事务并执行 BEGIN,它找到的每个查询以及事务完成时执行 COMMIT?
这就是所谓的逻辑交易与物理交易吗?
我想知道,因为我使用 @Transactional 测试来执行 GET 端点 + DELETE 端点 + READ_UNCOMMITED 的 GET 端点,所以行为能够很好地工作,但我在日志中没有看到删除查询的痕迹,只有选择。
我本希望看到发出的所有查询,然后回滚,但我感觉事务只是修改持久性上下文的托管实体,并且只是尝试在测试结束时保存...
如果我应该在执行repository.removes()时看到所有删除查询,那么可能由于某种原因hibernate仅将查询记录在readonly = false事务中
最佳答案
也许这个答案对您有帮助:JPA flush vs commit
如果存在 Activity 事务,JPA/Hibernate 将在提交事务时执行刷新方法。同时,应用于实体的所有更改都收集在 Unit of Work 中。 .
In flush() the changes to the data are reflected in database after encountering flush, but it is still in transaction.flush() MUST be enclosed in a transaction context and you don't have to do it explicitly unless needed (in rare cases), when EntityTransaction.commit() does that for you.
您可以通过更改刷新策略来更改此行为。
关于java - 默认的@Transactional在底层是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53422349/