grails - Grails @Transactional 与 Spring @Transactional 注释之间的差异

标签 grails annotations transactional grails-2.3 grails-2.5

好吧,Grails 中有一个观点 Declarative Transactions .它说:

The grails.transaction.Transactional annotation was first introduced in Grails 2.3. Prior to 2.3, Spring's @Transactional annotation was used.



但我似乎无法找出这两个注释之间的主要区别是什么。为什么在 future 的版本中没有使用 Spring 的注解?

最佳答案

我想解决这个评论“但是,在 2.3 中,团队认为引入一个新的注释是一个好主意(我个人不同意),该注释不仅可以应用于服务,还可以应用于 Controller 。”

Grails 团队的主要意图从来都不是引入一个可以在 Controller 和服务上使用的注释。我们的主要目的是引入一个 AST 转换,它消除了对代理的需求,并且比 Spring 的 @Transactional 性能更好。 Grails 的 @Transactional 将处理事务的必要逻辑直接连接到字节码中,并且不需要代理,因此我们认为它比 Spring 的版本更好。

它也适用于 Controller 的事实只是我们发现的上述结果的副作用。话虽如此,根据我们的经验,太多 Grails 用户在使用 Controller 时没有正确划分他们的事务边界。如果您将 Controller 操作标记为只读,则 Hibernate 不需要对您在该操作范围内执行的任何查询执行脏检查。这极大地提高了 Grails 应用程序的性能,并且是一件非常好的事情。

我们绝对鼓励将逻辑分离为服务,但如果您考虑以下简单示例:

  @Transactional(readOnly=true)
  def show(Long id) {
       respond Foo.get(id)
  }

为这样一个微不足道的操作引入服务是多余的,但是如果您不使用只读事务划分查询,那么 Hibernate 会对实例执行脏检查,这会损害性能。

22/02/16 更新:从 Grails 3.1 开始,Spring 版本被认为已弃用并默认禁用(如果需要,您仍然可以重新启用)

关于grails - Grails @Transactional 与 Spring @Transactional 注释之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23627215/

相关文章:

typescript 注释

xml - 什么是用 grails 制作 XML 的好方法

ajax - 加载部分模板 Ajax - 使用 Grails

c# - 属性或注释的酷用途(CLR 或 Java)?

jpa - 如何为 Spring Roo 实体实现 "delete all"?

java - Spring数据JPA : InvalidDataAccessApiUsageException for @Transactional

java - Spring Boot : Transaction with two DB, 如果第二个数据库失败则回滚第一个数据库

grails - 试用neo4j grails插件,但与文档不匹配

regex - Grails 域类单元测试,约束设置问题 - java.lang.NoClassDefFoundError : Could not initialize

java - 在 Spring Batch 3.0.x 中 - 如何为非标准数据库设置数据库类型?