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

时间:2014-05-13 09:17:11

标签: grails annotations transactional grails-2.3 grails-2.5

Grails Declarative Transactions中有一点。它说:

  

grails.transaction.Transactional注释最初是在Grails 2.3中引入的。在2.3之前,使用了Spring的@Transactional注释。

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

5 个答案:

答案 0 :(得分:29)

我想谈谈这个评论"然而,在2.3中,团队认为引入一个新的注释是一个好主意(我个人不同意),它不仅可以应用于服务,还可以应用于控制器。“

Grails团队的主要目的不是引入可用于控制器和服务的注释。我们的主要目的是引入一个AST转换,消除了对代理的需求,并且比Spring的@Transactional表现得更好。 Grails的@Transactional为将事务直接处理到字节代码中所必需的逻辑连接起来,并且不需要代理,因此我们觉得它比Spring的版本更好。

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

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

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

为这样一个简单的操作引入服务实在是太过分了,但是如果你没有用只读事务划分查询,那么Hibernate会对实例进行脏检查,这会损害性能。

更新22/02/16:从Grails 3.1开始,Spring版本被视为已弃用,默认情况下已禁用(如有必要,您仍可以重新启用)

答案 1 :(得分:5)

在2.3之前,使用了Spring注释,因为它已应用于服务。这只是简单的Spring bean。然而,在2.3中,团队认为引入一个新的注释是一个好主意(我个人不同意),它不仅可以应用于服务,还可以应用于控制器。区别在于Grails 2.3版本的注释在Grails控制器的概念中运行了很多AST转换魔法。

希望有所帮助。

<强>更新

从功能上讲,当应用于Services时,注释的Grails版本与Spring版本相同。虽然它的效率略高,因为它是在编译时应用于代码的AST转换,而不是在运行时应用的代理。

答案 2 :(得分:3)

  

为什么未来发行版中没有使用spring的注释?

您仍然可以使用Spring注释。 Grails版本更灵活,性能更高,因为我们可以在编译时装配很多逻辑,但Spring版本仍然存在,并且仍然像它一样。

答案 3 :(得分:1)

@PrakashJoshi说:

  

那么当你从动作调用服务方法时会发生什么,而动作又具有其他事务属性。它是否被被调用方法的事务行为覆盖?

这取决于您将事务传播行为设置为(在注释上可设置)。 PROPAGATION_REQUIRED(默认值)将继续现有的,但PROPAGATION_NEW将启动一个新的,暂停当前的。

答案 4 :(得分:0)

您仍然可以使用spring注释,但grails版本更快,更了解框架。

我强烈建议您使用grails版本。