Я унаследовал систему, использующую Spring MVC и Hibernate, которая хранится в базе данных DB2. Недавно DB2 начала сообщать о проблеме, похожей на тупиковую, поэтому я работал над ее отладкой. Я не специалист по Spring или Hibernate, но кое-что знаю об обоих.
Код структурирован следующим образом:
controller -> service -> one or more DAO classes that performs the updates
В ситуации, когда возникает проблема, контроллер вызывает службу метод, помеченный @Transactional
и @Override
. Служба переходит к классу DAO, помеченному @Repository
, и вызывает несколько методов, аннотированных @Transactional
и @Override
. Такова структура кода.
Один контроллер вызывает один сервисный метод. Метод службы вызывает несколько методов DAO. Большинство методов DAO помечены @Transactional
и @Override
. Некоторые имеют REQUIRES_NEW в @Transactional
. Также в каждом методе DAO Session
получает SessionFactory.getCurrentSession()
.
Первый вопрос: при таком подходе, где начинается транзакция и где находится окончательная фиксация? А откат? Ничто из этого не кодируется явно.
Тупик возникает, когда один из методов обновляет запись, а затем последующий метод удаляет ту же запись. Если вам интересно, почему кто-то хочет это сделать, обновление добавляет идентификатор пользователя человека, желающего удалить информацию из записи, чтобы ее можно было сохранить сохраненным процессом в другую таблицу. Затем второй вызов метода удаляет запись.
Первоначальный кодировщик пытался добавить REQUIRES_NEW к @Transactional
, думая, что новая транзакция обеспечит обновление. Но взаимоблокировка по-прежнему происходит с нерегулярными интервалами.
Я попытался изменить обновление на собственный вызов SQL, но Hibernate не позволяет мне начать другую транзакцию, поскольку она уже открыта.
Кто угодно есть какие-нибудь указания здесь?