Подтвердить что ты не робот

Есть ли лучший способ определить, активна ли транзакция DB Spring, чем при использовании TransactionSynchronizationManager.isActualTransactionActive()?

У меня есть код устаревшего кода, который я пытаюсь повторно использовать в Spring. Этот код глубоко вложен в другой код, поэтому он непрактичен для перепроектирования и вызывается во многих ситуациях, только некоторые из них проходят через Spring. Я бы хотел использовать транзакцию Spring, если она была запущена; в противном случае, продолжать использовать существующий (устаревший) механизм соединения db. Наша первая мысль заключалась в том, чтобы сделать наш класс наследия bean и использовать введенный TransactionPlatformManager, но, похоже, для нашей ситуации не существует каких-либо методов. Некоторые исследования показали, что Spring имеет класс под названием TransactionSynchronizationManager, который имеет статический метод isActualTransactionActive(). Мое тестирование указывает, что этот метод является надежным способом обнаружения активности транзакции Spring:

  • При вызове через Spring сервис без аннотации @Transactional он возвращает false
  • При вызове через Spring сервис с @Transactional он возвращает true
  • В моем унаследованном методе, который называется существующим, он возвращает false

Мой вопрос: есть ли лучший способ определить, активна ли транзакция?

4b9b3361

Ответ 1

Нет лучшего способа, чем TransactionSynchronizationManager.isActualTransactionActive(). Это метод утилиты, используемый spring для обработки транзакций. Хотя это нецелесообразно использовать в вашем коде, для некоторых конкретных случаев вам необходимо - то, почему оно открыто.

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