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

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

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

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

1 Ответ

47 голосов
/ 16 августа 2011

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

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

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