让我先说明我的代码昨天正在运作。我将我的提交回滚到它工作的时间。
唯一不同的是今天运行了迁移以从某些表中删除某些列。我无法看到这会对它产生怎样的影响
我正在进行谷歌oauth身份验证,而在谷歌的回调网址中,我正在进行大量的保存/更新/等等。我的控制器会调用单个服务来执行所有操作。如果我在return语句的断点处查询数据,我可以看到数据。没有例外,验证错误或任何会让我相信任何错误的东西。有什么想法吗?
class MyController {
def myService
def callback() {
myService.update()
//At this point when I run X.get(1) it is returning null
redirect uri: "..."
}
}
@Transactional
class MyService {
def update() {
...
//If I break at this return statement I can run X.get(1) and it returns
return someData;
}
}
编辑:我找到了原因,但我不明白这是怎么回事。我最终打电话给userDetailsService.loadUserByUsername
。该方法抛出NoStackUsernameNotFoundException
。我在我的代码中捕获了该异常,但它导致事务无论如何都会回滚。
答案 0 :(得分:0)
在事务期间抛出的任何异常,即使您捕获并处理它,也会导致事务回滚。
要解决这个问题,您可以选择以下几种方法:
在您的服务中,设置
static transactional = false
然后声明自己的事务块:
MyDomain.withTransaction { tx ->
try {
userDetailsService.loadUserByUsername(...)
} catch (NoStackUsernameNotFoundException e) {
log.warn("Can't load user...")
}
//stuff you try to persist here will
//be written to the database successfully
//despite the NoStackUsernameNotFoundException
//being thrown & caught
}