2013-11-11 1 views
1

Я использую Grails Hibernate транзакции, чтобы сделать следующее в действии контроллера:Сделка транзакций в Grails?

user.save(flush:true) 

User.withTransaction { 
    user.name = "newName" 
    user.save(flush: true) 
} 

Что Hibernate/Grails делать в этом случае? Когда я сбрасываю сеанс гибернации на первом флеше, с помощью команды toTransaction создается новый сеанс или он будет прикреплять два сейва в один сеанс?

+0

является частью этого Контролера или Сервиса? –

+0

@drorb Это часть действия контроллера – confile

ответ

4

Если это действие контроллера, то сеанс Hibernate будет открыт все время с момента запуска перехватчика OpenSessionInView для вас в начале запроса. В вызове withTransaction используется текущий сеанс по локальной сети.

Обратите внимание, что транзакция будет очищать сеанс, поэтому нет необходимости делать это явно. Также обратите внимание, что вы действительно не должны загрязнять код контроллера транзакциями и другой логикой настойчивости (или бизнеса) - этот код должен быть в методе транзакционных услуг.

+0

Это что-то меняет, если я не использую withTransaction здесь? – confile

+1

Только то, что второе сохранение не будет выполнено в транзакции. В 2.3 генерируемые контроллеры имеют аннотацию '@ Transactional', но без этого (и в более ранних версиях Grails) по умолчанию нет активных транзакций в контроллерах. Вот почему услуги - лучшее место для обновлений баз. –

+0

@BurtBeck только для того, чтобы прояснить это ... тогда услуги grails похожи на транзакционные аннотации по умолчанию? – Rafael

 Смежные вопросы

  • Нет связанных вопросов^_^