8

以下动作有什么区别?

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

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

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

4

1 回答 1

13

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

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

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

于 2013-08-01T12:51:45.630 回答