В моем контролере "Удалить" я ожидаю, что если произойдет событие DataIntegrityViolationException, то связанные записи управления будут восстановлены, но это не так. Мне действительно не нужно даже делать явный откат в любом случае, но с или без него откат не происходит. Похоже, что с откатом транзакций не работает. Или я делаю что-то неправильно? Я использую Grails 1.3.7 и MySQL (innodb).
Person.withTransaction { status ->
Authority.findAll().each { it.removeFromPeople(person) }
try {
person.delete()
flash.message = "person.deleted"
flash.args = [params.id]
flash.defaultMessage = "User ${params.id} deleted"
redirect(action: "list")
}
catch (org.springframework.dao.DataIntegrityViolationException e) {
status.setRollbackOnly()
flash.message = "person.not.deleted"
flash.args = [params.id]
flash.defaultMessage = "User ${params.id} could not be deleted"
redirect(action: "show", id: params.id)
}
}
UPDATE
Я понял, что некоторые из моих таблиц, а не innodb. Я исправил это, и сначала было похоже, что проблема решена. Я мог бы попытаться удалить запись пользователя, получить ошибку, а затем перейти и войти в систему как пользователь. Раньше с этой ошибкой логин был неудачным, что означает, что записи "Орган" не были отброшены назад.
ERROR springsecurity.GrailsDaoImpl - User [admin9] has no GrantedAuthority
Итак, все выглядело хорошо. Затем я перезапустил приложение, попытался войти в систему и снова получил ошибку. Поэтому, несмотря на то, что откат, похоже, работал, записи, которые никогда не сохранялись в базе данных.
Может быть, вы выполняете этот код из другой транзакции? Может быть, из сервисного метода, который по умолчанию является транзакционным?
MySQL не поддерживает вложенные транзакции.