Grails .save(flush:true)与.save()

时间:2017-07-25 12:13:39

标签: grails groovy hql transactional

我们一直在测试不同的储蓄方式。但是,结果并不像我们预期的那样。我们有创建调查方法,每个调查都有多个问题。我们测试了几个案例,他们都以同样的方式提交了查询。

@Transactional class Service {
      Survey createNewSurvey(NewSurveyCommand command) {
       Survey survey = new Survey()
       survey.properties[] = command.properties
       survey.save(flush: true, failOnError: true)  //save survey and flush
       for (NewQuestionCommand questionCommand : command.questions) {
           Question question = new Question()
           question.properties[] = questionCommand.properties
           question.save(flush: true, failOnError: true)  // save each questions and flush
       }
       return survey    } }

第二个删除事务和保存没有刷新

 class Service {
      Survey createNewSurvey(NewSurveyCommand command) {
       Survey survey = new Survey()
       survey.properties[] = command.properties
       survey.save()  //save survey and flush
       for (NewQuestionCommand questionCommand : command.questions) {
           Question question = new Question()
           question.properties[] = questionCommand.properties
           question.save()  // save each questions and flush
       }
       return survey    } }

第3和第4,一次是交易,一次是没有交易。

class Service {
          Survey createNewSurvey(NewSurveyCommand command) {
           Survey survey = new Survey()
           survey.properties[] = command.properties
           survey.save()  //save survey and flush
           for (NewQuestionCommand questionCommand : command.questions) {
               Question question = new Question()
               question.properties[] = questionCommand.properties
              survey.addToQuestions()
    }
           survey.save(flush: true, failOnError: true)
           return survey    } }

在MySQL日志的最后,我们检查了无论我们在一次提交中发生了所有插入。

    Query    SET autocommit=0
    Query    insert into survey (version, brand ,...)
    Query    insert into question (version,..d)
    Query    insert into question (version,..d)
    Query    commit
    Query    SET autocommit=1

最后我们没有看到.save(flush:true,failOnError:true),save()(有或没有Transactional)之间的任何区别。

有人可以解释save with flushwithout flush的工作原理吗?

Grails doc表示flush(可选) - 当设置为true时,刷新持久化上下文,立即保持对象。然而,在我们的案例中,我们看到,它并没有像医生所说的那样发生。还是我误解了它?

1 个答案:

答案 0 :(得分:3)

没有save()

flush: true无法启动数据库连接。调用save()之后,数据仅在Hibernate会话中保留。所以在你的情况下,你不会在MYSQL日志文件中找到任何相关的行。

save(flush: true) 立即在数据库级别启动事务。因此,在第一次调用save(flush: true)之后,您应该已经在MYSQL日志文件中看到了一些行,可能就像:

Query    SET autocommit=0
Query    insert into survey (version, brand ,...)

第二次调用save(flush: true)后,数据库级别的事务继续(不再启动,因此在两次保存之间不会发生COMMIT)。您还可以看到添加到MYSQL日志文件的行。