java - 默认的@Transactional在底层是如何工作的?

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

传播所需的默认 @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/

相关文章:

java - ComponentScan excludeFilters 在 Spring 4.0.6.RELEASE 中不起作用

java - AJAX JSON 数据检索(Portlet+Liferay+JSON+Spring)

java - Spring AOP 中的错误 "The hierarchy of the type ClassName is inconsistent"

java - 如何在 Spring Boot 运行时添加新的数据源

java - 如何使用自定义消息记录 jpa 查询?

java - JSF 异常处理

Java Swing GUI - 如何让一个线程一直处于 sleep 状态并通过点击唤醒?

java - 如何理解 Android 中的电话忙?

Spring数据JPA配置

java - JDBC语句执行时如何收集警告/通知?