Я использую grails 1.3.7 вместе с Oracle 11g и пытаюсь управлять внутренними транзакциями. У меня есть bean-компонент, который передается транзакционному (Propagation.REQUIRED) метод обслуживания, который делает некоторые изменения. Затем он передается другому транзакционному методу (propation = Propagation.REQUIRES_NEW), который выполняет некоторые другие модификации и затем выдает исключение. То, что я ожидал увидеть, - это откат всех модификаций второй службы, но все еще действительный для первого. В этой ситуации:grails Вложенная транзакция bean reset
//outer transaction
class MyService {
def nestedService
@Transactional(propagation = Propagation.REQUIRED)
public void testRequiredWithError(Person person) {
person.name = 'Mark'
try {
nestedService.testRequiresNewWithError(person)
} catch (RuntimeException e) {
println person.age //this prints 15
println e
}
}
}//end MyService
//inner transaction
class NestedService{
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void testRequiresNewWithError(Person person) {
person.age = 15 //expected after Exception will be discarded
throw new RuntimeException("Rollback this transaction!")
}
}
Затем я запускаю консоль Грайля и проверяю БД после его завершения. ...
def p = Person.get(671)
def myService = ctx.myService
println p.name //'John'...from DB
println p.age //25...from DB
myService .testRequiredWithError(p)
println p.name // 'Mark'....correct
println p.age // 15....UNEXPECTED..
//same result checking on the DB after console ends and transaction flushes
Я пытался использовать Propagation.NESTED после его активации в начальной загрузки по transactionManager.setNestedTransactionAllowed(true)
и использовать как точки сохранения на этом посту grails transaction set savepoint , но все-таки получил тот же результат.
Что мне не хватает ????
Заранее спасибо.
для вашего теста, попробуйте очистить сеанс, а затем повторите попытку. grailsApplication.getCurrentSession(). clear() – juandiegoh
Откат на уровне базы данных не на уровне объекта. Но я не уверен, что если ваш откат REQUIRES_NEW устанавливает ваш возраст как грязный или нет. Если это не так, то при повторном поиске в базе данных (после очистки сеанса) возраст будет равен 25. – juandiegoh
Благодарим вас за советы. Я уже пытался очистить сеанс, но все тот же. Я почти уверен, что вы правы, что возраст не установлен как грязный beacause, я вижу, что он сохранялся в БД. Еще раз спасибо за ответ. – albe