withTransaction не делает откатов правильно - PullRequest
0 голосов
/ 24 февраля 2011

В моем действии удаления контроллера 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

Так что все выглядело хорошо. Затем я перезапустил свое приложение, попытался войти в систему и снова получил ошибку. Таким образом, несмотря на то, что откат, казалось, работал, записи никогда не сохранялись в базе данных.

1 Ответ

0 голосов
/ 25 февраля 2011

Может быть, вы выполняете этот код из другой транзакции?Может быть, из сервисного метода, который по умолчанию является транзакционным?

MySQL не поддерживает вложенные транзакции.

...