Почему я получаю исключение SpringFramework UnexpectedRollbackException? - PullRequest
2 голосов
/ 19 января 2012

Я получаю следующее сообщение об ошибке Spring Framework:

Invocation of getLogoForGlobalConext() in class $Proxy44 threw exception
org.springframework.transaction.UnexpectedRollbackException:
Transaction rolled back because it has been marked as rollback-only
at template/includes/macros.vm line 1651, column 43

Я открыл macros.vm и посмотрел строку 1651, и это выглядит так:

#set ($globalLogo = $spaceManager.getLogoForGlobalContext());

Из моего исследования похоже, что $Proxy44 на самом деле является $spaceManager переменной (или экземпляром DefaultSpaceManager.java).

Это сообщение появляется случайно, и когда веб-приложение пытается загрузить изображение / вложение, находящееся где-то на веб-сервере / в базе данных.

Менеджер вложений управляется Spring Transaction Management, и при загрузке изображения / вложения используются следующие атрибуты транзакции:

  1. распространение - для всех методов в диспетчере вложений

  2. распространение и только чтение - для всех методов в менеджере вложений, начинающихся с "get".

Атрибуты определены в Spring Framework - Глава 9. Управление транзакциями . Я думаю, что мне нужно установить тайм-аут для транзакций (например, установить его в бесконечность).

1 Ответ

2 голосов
/ 21 января 2012

Оказывается, один из методов получения выполнял запись в базу данных.В частности, он обновлял кэш с некоторой информацией каждые несколько минут.Когда произошло это обновление, UnexpectedRollbackException был брошен.Так как эта транзакция должна быть «только для чтения», как определено вышеупомянутыми атрибутами транзакции, нам не разрешено выполнять обновления во время операции получения.

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

Надеюсь, это поможет кому-то еще.

...