根据剧照!文档中,它会自动为每个请求创建一个事务,无论您是否需要:
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/