java - 如果玩!自动为每个请求启动一个事务并管理它,为什么在方法上放置@Transactional?

标签 java hibernate jpa playframework transactions

根据剧照!文档中,它会自动为每个请求创建一个事务,无论您是否需要:

Play will automatically manage transactions for you. It will start a transaction for each HTTP request and commit it when the HTTP response is sent. If your code throws an exception, the transaction will automatically rollback.

https://www.playframework.com/documentation/1.3.x/jpa

鉴于此,@Transactional 注释的意义何在?它不会打开事务,因为文档表明事务已经打开。

稍后 Play 的文档!框架 (2.5) 似乎与此声明相矛盾,表示如果没有 @Transactional,您的 JPA 方法调用将违反它们全部发生在事务中的要求:

Every JPA call must be done in a transaction so, to enable JPA for a particular action, annotate it with @play.db.jpa.Transactional.

https://www.playframework.com/documentation/2.5.x/JavaJPA

@Transactional
public Result index() {
    return ok("A Transactional action");
}

是哪一个?如果从 HTTP 上下文调用您的方法,除非使用该注释,否则该方法不会在事务中运行吗?

如果您更改事务隔离级别(在conf中),这是否意味着每个调用都将在该级别事务中,或者仅在@Transactional方法中?

最佳答案

您正在混合两个截然不同的 Play 版本(例如 Angular 1 和 2)。例如,Play 1.x 是基于 Java 构建的,而 Play 2.x 是基于 Scala 构建的,并提供 Scala+Java API。所以我认为文档中不存在矛盾。

在游戏 1 中:

  • 交易自动管理
  • 您可以使用注释来更改此设置:例如 @play.db.jpa.NoTransaction 来禁用事务

在游戏 2 中:

  • 没有“自动”交易;
  • 您必须使用@Transactional 来获取“自动”交易(Play 1 中的默认行为)

关于“事务隔离级别(在conf中)”,我不能说什么,因为我从未使用过它(你能举个例子吗?),但我想它会将该隔离级别应用于每个用注释注释的操作@Transactional 或其他 JPA 方法(例如 JPAApi.withTransaction)

关于java - 如果玩!自动为每个请求启动一个事务并管理它,为什么在方法上放置@Transactional?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37615626/

相关文章:

java - 正在创建表单上的输入数据,但不保留正在传递的值,我该如何解决这个问题?

hibernate - Grails - 严重的 IllegalStateException - 类 [] 上的方法在 Grails 应用程序之外使用

java - 如何在hibernate中连接两个表并获取所有匹配的记录(使用实体类映射)

hibernate - 为什么 hibernate/jpa 在删除映射列表中的已删除元素之前将 @OrderColumn 字段设置为 null?

multithreading - 两个并发请求,相同的 JPA 实体 - 有问题吗?

java - 按给定规则测试变量

java - GridBagLayout 动态使用面板内的额外空间

java - Java中非法前向引用的问题

hibernate - 如何在 JPA 实体管理器中锁定整个实体(表)

java - 如何实现一个通用的方法来使用 Hibernate 从数据库中获取数据?