withTransaction не делает откатов правильно

0

В моем контролере "Удалить" я ожидаю, что если произойдет событие 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

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

  • 0
    Оказывается не все мои таблицы где innodb. Власть оказалась ISAM. Не уверен, как это случилось.
Теги:
transactions
grails
spring-transactions

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню