【问题标题】:What is the difference between withTransaction and withNewTransaction?withTransaction 和 withNewTransaction 有什么区别?
【发布时间】:2013-08-02 09:28:25
【问题描述】:

以下动作有什么区别?

def someAction() {
  User.withTransaction { ... } 
}

def someAction() {
  User.withNewTransaction { ... }
}
  1. 什么时候用什么?

  2. 当一个 grails 操作只包含一个事务块时。在这种情况下,我猜 withTransaction 和 withNewTransaction 是相同的,因为每个操作都有自己的事务。这是真的?

【问题讨论】:

  • 我想第一个变体如果存在则参与现有事务,如果不存在则启动一个事务,而第二个变体总是启动一个新事务,无论是否已经执行
  • 我更新了我的问题。您如何看待问题 2?
  • 我同意@cmbaxter,只是一个旁注:控制器应该尽可能简单,只处理请求。如果您需要处理事务,服务是一个更好的地方(它们已经是事务性的)。

标签: hibernate grails transactions grails-2.0


【解决方案1】:

我相信这些功能与事务隔离语义有关。 withTransaction 函数将参与现有事务,如果已经启动一个事务,否则将启动一个新事务。 withNewTransaction 方法将始终启动一个新事务,无论是否已经启动,将该块内的代码隔离到它自己的事务中(具有自己的提交/回滚)。

如果您认为您正在开发的方法应该或可以通过多个单独的数据库写入参与某个更大的事务,那么您应该使用withTransaction,以便您可以在必要时参与更大的事务。如果您希望在另一个事务正在进行时您的写入与其他数据库写入完全隔离(并且如果此代码失败,则不会潜在地回滚该其他事务),请使用withNewTransaction

关于您的问题二,如果它们是在操作中进行的唯一调用,那么这两个将表现相同,因为它们都会启动新事务。

【讨论】:

  • 您是否知道或有任何参考文档,我可以在其中查找 withNewTransaction 是否为其他单独的事务使用新线程?
猜你喜欢
  • 2010-10-02
  • 2011-12-12
  • 2010-09-16
  • 2012-03-14
  • 2012-02-06
  • 2011-02-25
  • 2011-11-22
  • 2015-03-26
  • 2013-08-19
相关资源
最近更新 更多