Я бы не рекомендовал такой подход.Когда вы достигнете метода createState (), Grails будет пытаться использовать любые открытые транзакции перед созданием новой, если ни одна из них не будет доступна.
Вместо этого я бы просто использовал небольшие блоки транзакций, которые окружают только необходимый код grails, вместо попытки объявить методы транзакционными
http://www.grails.org/doc/1.3.x/ref/Domain%20Classes/withTransaction.html
, например, я могу получитьлюбой блок, такой как
State.withTransaction { status ->
//all the code in here has an explicit transaction
}
Эта транзакция либо сбрасывается, либо откатывается в конце блока, и транзакция имеет ссылку на объект Spring TransactionStatus.Это дает вам точный контроль зерна при обработке ошибок.Это позволит вам иметь большие транзакционные блоки, но по-прежнему решать, когда и где завершатся транзакции.
Я бы изменил код на
public def saveCountry() {
Country.withTransaction { status ->
Country co = new Country(name:'mycountry')
co.save()
}
createState()
}
public def createState(){
State.withTransaction { status ->
State state = new State(name:'state')
state.save()
throw new Exception
}
}
В этом случае страна будет сохранена, но странатранзакция будет отменена