В моем действии удаления контроллера Person я ожидаю, что если возникнет исключение DataIntegrityViolationException, то связанные записи Authority будут восстановлены, но это не так. Я действительно даже не должен делать явный откат в любом случае, но с или без него, откат не происходит. Похоже, что с транзакциями откаты не работают. Или я что-то не так делаю? Я использую 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. Я исправил это, и сначала казалось, что проблема была решена. Я мог бы попытаться удалить запись пользователя, получить ошибку, а затем зайти и войти в систему как этот пользователь. Ранее вход в систему не удался с этой ошибкой, что означает, что записи Authority не были откатаны.
ERROR springsecurity.GrailsDaoImpl - User [admin9] has no GrantedAuthority
Так что все выглядело хорошо. Затем я перезапустил свое приложение, попытался войти в систему и снова получил ошибку. Таким образом, несмотря на то, что откат, казалось, работал, записи никогда не сохранялись в базе данных.