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

时间:2017-08-30 07:00:07

标签: grails gorm multi-tenant spring-transactions grails3

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

当我这样做时,它可以正常工作:

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

但是当我把它移到服务方法

@Transactional
class MyService {
    doStuffHere() {
    }
}

该方法抛出"未找到会话"如果我没有使用上面的withTransaction()闭包那么会出错。

有人知道为什么会有区别吗?我还应该在服务上设置其他内容吗?在上面的服务的doStuffHere()方法中使用withTransaction()似乎是多余的。

2 个答案:

答案 0 :(得分:2)

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

' withTransaction'如果需要,将创建一个会话。 ' @事务'不会。

答案 1 :(得分:1)

主要区别在于它们如何表明交易的范围。

withTransaction通过事务覆盖块内的代码。

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

另请注意,withTransaction和@Transactional(不带任何参数)都使用PROPAGATION_REQUIRED,因此在事务性代码块中调用时,它将使用现有事务。