我正在使用多租户数据库处理Grails 3应用程序。可以理解的是,出于连接池性能的原因,对多租户数据库的任何查询都需要在事务中。我没有这个链接,但Graeme Rocher在SO的某个地方概述了它。
当我这样做时,它可以正常工作:
MyDomainClass.withTransaction { status ->
doStuffHere();
}
但是当我把它移到服务方法
时@Transactional
class MyService {
doStuffHere() {
}
}
该方法抛出"未找到会话"如果我没有使用上面的withTransaction()闭包那么会出错。
有人知道为什么会有区别吗?我还应该在服务上设置其他内容吗?在上面的服务的doStuffHere()方法中使用withTransaction()似乎是多余的。
答案 0 :(得分:2)
看看伯特答案的第三段:What is the difference between withTransaction and withSession in grails?
' withTransaction'如果需要,将创建一个会话。 ' @事务'不会。
答案 1 :(得分:1)
主要区别在于它们如何表明交易的范围。
withTransaction通过事务覆盖块内的代码。
@Transactional做同样的事情,但使用方法中的代码。
另请注意,withTransaction和@Transactional(不带任何参数)都使用PROPAGATION_REQUIRED,因此在事务性代码块中调用时,它将使用现有事务。