Есть ли лучший способ определить, активна ли транзакция DB Spring, чем при использовании TransactionSynchronizationManager.isActualTransactionActive()?
У меня есть код устаревшего кода, который я пытаюсь повторно использовать в Spring. Этот код глубоко вложен в другой код, поэтому он непрактичен для перепроектирования и вызывается во многих ситуациях, только некоторые из них проходят через Spring. Я бы хотел использовать транзакцию Spring, если она была запущена; в противном случае, продолжать использовать существующий (устаревший) механизм соединения db. Наша первая мысль заключалась в том, чтобы сделать наш класс наследия bean и использовать введенный TransactionPlatformManager
, но, похоже, для нашей ситуации не существует каких-либо методов. Некоторые исследования показали, что Spring имеет класс под названием TransactionSynchronizationManager
, который имеет статический метод isActualTransactionActive()
. Мое тестирование указывает, что этот метод является надежным способом обнаружения активности транзакции Spring:
- При вызове через Spring сервис без аннотации
@Transactional
он возвращает false
- При вызове через Spring сервис с
@Transactional
он возвращает true
- В моем унаследованном методе, который называется существующим, он возвращает false
Мой вопрос: есть ли лучший способ определить, активна ли транзакция?
Ответы
Ответ 1
Нет лучшего способа, чем TransactionSynchronizationManager.isActualTransactionActive()
. Это метод утилиты, используемый spring для обработки транзакций. Хотя это нецелесообразно использовать в вашем коде, для некоторых конкретных случаев вам необходимо - то, почему оно открыто.
Другим способом может быть использование диспетчера сущностей/сеанса/подключения и проверка там, если есть существующая транзакция, но я бы предпочел диспетчер синхронизации.