groovy - Grails .save(flush: true) behaves the same with .save() -


we have been testing different way of saving. however, results weren't expected. have create-survey method, , each survey has multiple questions. tested few cases , committed queries same way.

@transactional class service {       survey createnewsurvey(newsurveycommand command) {        survey survey = new survey()        survey.properties[] = command.properties        survey.save(flush: true, failonerror: true)  //save survey , flush        (newquestioncommand questioncommand : command.questions) {            question question = new question()            question.properties[] = questioncommand.properties            question.save(flush: true, failonerror: true)  // save each questions , flush        }        return survey    } } 

the second removing transactional , saving without flush

 class service {       survey createnewsurvey(newsurveycommand command) {        survey survey = new survey()        survey.properties[] = command.properties        survey.save()  //save survey , flush        (newquestioncommand questioncommand : command.questions) {            question question = new question()            question.properties[] = questioncommand.properties            question.save()  // save each questions , flush        }        return survey    } } 

the 3th , 4th, once transactional , once without transactional.

class service {           survey createnewsurvey(newsurveycommand command) {            survey survey = new survey()            survey.properties[] = command.properties            survey.save()  //save survey , flush            (newquestioncommand questioncommand : command.questions) {                question question = new question()                question.properties[] = questioncommand.properties               survey.addtoquestions()     }            survey.save(flush: true, failonerror: true)            return survey    } } 

in end mysql log, checked no matter did inserting happened within 1 commit.

    query    set autocommit=0     query    insert survey (version, brand ,...)     query    insert question (version,..d)     query    insert question (version,..d)     query    commit     query    set autocommit=1 

in end didn't see difference between .save(flush: true, failonerror: true), save() ( or without transactional).

could explain how save flush , without flush working.?

grails doc says flush (optional) - when set true flushes persistence context, persisting object immediately. however, in our case saw, didn't happen in doc says. or did misunderstand it?

save() without flush: true doesn't start database connection. after calling save() data persisted in hibernate session. in case, not find related lines in mysql log file.

save(flush: true) starts transaction on database level immediately. after calling save(flush: true) first time should see lines in mysql log file, sth like:

query    set autocommit=0 query    insert survey (version, brand ,...) 

after calling save(flush: true) second time transaction being continued (not started again, no commit happen between 2 saves) on database level. can see lines added mysql log file.


Comments

Popular posts from this blog

networking - Vagrant-provisioned VirtualBox VM is not reachable from Ubuntu host -

c# - ASP.NET Core - There is already an object named 'AspNetRoles' in the database -

ruby on rails - ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true -