Grails withTransaction() 和事务服务方法之间的区别

Difference between Grails withTransaction() and a transactional service method

我正在开发一个带有多租户数据库的 Grails 3 应用程序。可以理解的是,出于连接池性能的原因,对多租户数据库的任何查询都需要在事务中进行。我没有 link 但 Graeme Rocher 在 SO 的某处概述了它。

所以当我执行以下操作时它工作正常:

MyDomainClass.withTransaction { status ->
   doStuffHere();
}

但是当我将其移至服务方法时

@Transactional
class MyService {
    doStuffHere() {
    }
}

如果我没有使用上面的 withTransaction() 闭包,该方法会抛出 "No session found" 错误。

有人知道为什么不一样吗?我还应该在服务上设置什么吗?在上面的服务的 doStuffHere() 方法中使用 withTransaction() 似乎是多余的。

看看伯特回答的第三段:What is the difference between withTransaction and withSession in grails?

'withTransaction' 将根据需要创建会话。 '@Transactional' 不会。

主要区别在于它们指示交易范围的方式。

withTransaction 用事务覆盖块内的代码。

@Transactional 做同样的事情,但是在方法中使用代码。

另请注意,withTransaction 和 @Transactional(without any parameters) 都使用 PROPAGATION_REQUIRED,因此在事务代码块中调用时将使用现有事务.