【问题标题】:Transaction Scope in Grails?Grails中的事务范围?
【发布时间】:2013-11-23 09:30:12
【问题描述】:

我使用 Grails Hibernate 事务在控制器动作中执行以下操作:

user.save(flush:true)

User.withTransaction {
  user.name = "newName"
  user.save(flush: true)
}

在这种情况下,Hibernate/Grails 做了什么?当我在第一次刷新时刷新休眠会话时,withTransaction 是创建一个新会话还是将两个保存附加到一个会话中?

【问题讨论】:

  • 这是控制器还是服务的一部分?
  • @drorb 它是控制器动作的一部分

标签: hibernate grails grails-2.0


【解决方案1】:

如果它在控制器操作中,那么将会有一个 Hibernate 会话一直打开,因为 OpenSessionInView 拦截器在请求开始时为您启动它。 withTransaction 调用使用当前线程本地会话。

请注意,事务将刷新会话,因此无需显式执行。另请注意,您真的不应该用事务和其他持久性(或业务)逻辑污染控制器代码 - 此代码应该在事务服务方法中。

【讨论】:

  • 如果我在这里不使用 withTransaction 会改变什么吗?
  • 只有第二次保存不会在事务中完成。在 2.3 中,生成的控制器有一个 @Transactional 注释,但没有它(以及在早期版本的 Grails 中)默认情况下控制器中没有活动事务。这就是为什么服务是数据库更新的最佳场所。
  • @BurtBeckwith 只是为了澄清这一点......然后 grails 服务就像默认情况下的事务性注释?
  • 是的,但这与使用org.springframework.transaction.annotation.Transactional 相同。您想使用更新的grails.transaction.Transactional注解,它具有相同的功能,并避免在内部调用另一个注解方法忽略注解属性的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多