Да, это будет сделано.
Транзакции в Grails по умолчанию обрабатываются на уровне метода Service. Если метод возвращается нормально, тогда транзакция будет зафиксирована, если выдается RuntimeException, транзакция будет откатываться.
Обратите внимание, что это означает, что даже если вы используете flush: true при сохранении объекта в методе сервера, изменения в БД все равно будут отменены, если вы выбросите RuntimeException.
Например:
class MyService {
def fiddle(id,id2){
def domain = Domain.findById(id)
domain.stuff = "A change"
domain.save( flush:true ) // will cause hibernate to perform the update statements
def otherDomain = OtherDomain.findById(id2)
otherDomain.name = "Fiddled"
if( !otherDomain.save( flush:true )){ // will also write to the db
// the transaction will be roled back
throw new RuntimeException("Panic what the hell happened")
}
}
}
То, что я не на 100% ясен с Grails, - это то, что происходит, если в прямом мире Java / Spring выдается проверенное исключение. По умолчанию поведение инициатора транзакции фиксирует транзакцию, хотя это может быть переопределено в конфигурации. .
Примечание: есть предостережение, и ваша база данных должна поддерживать транзакции в таблицах, которые вы обновляете. Да, это тыкать в MySQL:)
Это также относится к методу Domain.withTransaction
.