Откат транзакции в Сервисе Grails

Я обновлял все свои сервисы, чтобы быть транзакционным при помощи способности Чаши Грааля откатывать, когда RuntimeException брошен в сервис. Я имею, в большинстве случаев, делая это:

def domain = new Domain(field: field)
if (!domain.save()) {
   throw new RuntimeException()
}

Так или иначе я хотел проверить, что это действительно будет откатывать транзакцию... это получило меня думающий относительно того, фиксировалось ли в этой точке это уже.. Кроме того, в противном случае был бы, устанавливая flush:true изменение это? Я не очень знаком с тем, как Spring/Быть в спящем режиме делает все это :)

13
задан Jay P. 17 March 2012 в 14:12
поделиться

1 ответ

Ага, хватит.

Транзакции в Grails по умолчанию обрабатываются на уровне метода обслуживания.Если метод возвращается нормально, транзакция будет зафиксирована, если выбрасывается исключение 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 .

16
ответ дан 1 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: