我们一直在测试不同的储蓄方式。但是,结果并不像我们预期的那样。我们有创建调查方法,每个调查都有多个问题。我们测试了几个案例,他们都以同样的方式提交了查询。
@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 flush
和without flush
的工作原理吗?
Grails doc表示flush(可选) - 当设置为true时,刷新持久化上下文,立即保持对象。然而,在我们的案例中,我们看到,它并没有像医生所说的那样发生。还是我误解了它?
答案 0 :(得分:3)
save()
的 flush: true
无法启动数据库连接
save(flush: true)
立即在数据库级别启动事务。因此,在第一次调用save(flush: true)
之后,您应该已经在MYSQL日志文件中看到了一些行,可能就像:
Query SET autocommit=0
Query insert into survey (version, brand ,...)
第二次调用save(flush: true)
后,数据库级别的事务继续(不再启动,因此在两次保存之间不会发生COMMIT
)。您还可以看到添加到MYSQL日志文件的行。