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,因此在事务代码块中调用时将使用现有事务.
我正在开发一个带有多租户数据库的 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,因此在事务代码块中调用时将使用现有事务.