Grails @Transactional与Spring @Transactional注释之间的区别 - 代码日志

Grails @Transactional与Spring @Transactional注释之间的区别

Grails service documentation有一点,它说:

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

但我似乎无法找出这两个注释之间的主要区别。为什么Spring的注释在以后的版本中不被使用?

我想解释这个评论“但是,在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版本被视为已弃用,默认情况下禁用(如果需要,您仍然可以重新启用)

http://stackoverflow.com/questions/23627215/differences-between-the-grails-transactional-vs-the-spring-transactional-anno

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Grails @Transactional与Spring @Transactional注释之间的区别