Как регистрировать содержимое транзакции Spring - PullRequest
7 голосов
/ 07 сентября 2010

Были различные сообщения о регистрации активности (запуск, принятие и откат) менеджера транзакций Spring.Однако недавно я столкнулся с тупиковой проблемой, для которой недостаточно просто регистрировать действия.

Фундаментальная проблема в нашем коде - это грязное использование транзакций распространения REQUIRED и REQUIRES_NEW.Существует так много вызовов методов туда и обратно, что мы заканчиваем множеством транзакций, накладываемых друг на друга.Увы, база кода огромна, и решение срочно ... (Мы все знаем, что это такое.)

Проблема была в тупике, потому что код был добавлен в объекты запроса в транзакции, которая была последовательно измененав другой транзакции.Spring выдает исключение, сообщающее об обновлении сущности X, потому что оно заблокировано.Зная, что это хорошо, но как найти неисправный код: запрос, который выполняет раннюю блокировку.

Мой вопрос (наконец-то): есть ли способ зарегистрировать сущности, добавляемые в транзакцию?Таким образом, я могу специально искать транзакции, блокирующие сущность, на которую жалуется Spring.

Спасибо!: -)

Ответы [ 2 ]

1 голос
/ 01 октября 2010

Spring делегирует диспетчеру транзакций, поэтому Spring не знает, какие объекты затрагиваются в транзакции, менеджер транзакций.Как сказал Донз, поиск менеджера транзакций для получения информации является лучшим следственным подходом.

Вы также можете просмотреть все определения транзакций и удалить REQUIRES_NEW из всего, кроме только запись / запись всегда методы типа(например, аудит или ведение журнала).Если у вас есть REQUIRES_NEW в вашей основной бизнес-логике, это ошибка или какой-то очень странный дизайн.Слепое удаление может иметь меньше побочных эффектов, чем вы думаете.

0 голосов
/ 30 сентября 2010

Попробуйте зарегистрировать запросы в вашем ORM. Может быть, это будет более простой способ найти «плохую» транзакцию.

...