Ответ 1
Да, это сделает.
Транзакции в Grails по умолчанию обрабатываются на уровне метода сервиса. Если метод возвращается нормально, то транзакция будет совершена, если будет выбрано RuntimeException, транзакция будет отменена.
Обратите внимание, что это означает, что даже если вы используете flush: true при сохранении объекта в методе сервера, изменения db все равно будут отменены, если вы выкинете исключение 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 мире, поведение по умолчанию для транзакционного inceptor для совершения транзакции, поскольку это может быть переопределено в config.
Примечание. Существует предостережение, и именно этот ваш db должен поддерживать транзакции в таблицах, которые вы обновляете. Да, это вызывается в MySQL:)
Это также относится к методу Domain.withTransaction
.