从服务返回后数据未保留

时间:2015-07-02 02:03:25

标签: grails spring-security grails-2.5

让我先说明我的代码昨天正在运作。我将我的提交回滚到它工作的时间。

唯一不同的是今天运行了迁移以从某些表中删除某些列。我无法看到这会对它产生怎样的影响

我正在进行谷歌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。我在我的代码中捕获了该异常,但它导致事务无论如何都会回滚。

1 个答案:

答案 0 :(得分:0)

在事务期间抛出的任何异常,即使您捕获并处理它,也会导致事务回滚。

要解决这个问题,您可以选择以下几种方法:

  1. 在引发异常的点之前执行检查,并且在您知道会引发异常的情况下不执行违规代码
  2. 自己处理交易 -
  3. 在您的服务中,设置

    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
    }