Автор оригинала: Jordan Simpson.
1. Обзор
Обнаружение транзакций может быть полезно для целей аудита или для работы со сложной кодовой базой, где не были реализованы хорошие соглашения о транзакциях.
В этом кратком руководстве мы рассмотрим несколько способов обнаружения транзакций Spring в нашем коде.
2. Конфигурация транзакции
Чтобы транзакции работали весной, необходимо включить управление транзакциями. Spring по умолчанию включит управление транзакциями, если мы используем проект загрузки Spring с зависимостями spring-data-* или spring-tx . В противном случае нам придется включить транзакции и явно предоставить менеджер транзакций.
Во-первых, нам нужно добавить аннотацию @EnableTransactionManagement в наш класс @Configuration . Это позволяет управлять транзакциями Spring на основе аннотаций для нашего проекта.
Затем мы должны предоставить либо PlatformTransactionManager , либо Reactive TransactionManager bean. Для этого компонента требуется Источник данных . Мы могли бы использовать ряд общих библиотек, таких как библиотеки для H2 или MySQL. Наша реализация не имеет значения для этого урока.
Как только мы включим транзакции, мы сможем использовать аннотацию @Transactional для создания транзакций.
3. Использование TransactionSynchronizationManager
Spring предоставил класс с именем Transactionsynchronizationmanager . К счастью, у этого класса есть статический метод, который позволяет нам узнать, находимся ли мы в транзакции, называемой isActualTransactionActive() .
Чтобы проверить это, давайте аннотируем метод тестирования с помощью @Transactional . Мы можем утверждать, что isActualTransactionActive() возвращает true :
@Test @Transactional public void givenTransactional_whenCheckingForActiveTransaction_thenReceiveTrue() { assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); }
Аналогично, тест должен утверждать, что false возвращается, когда мы удаляем аннотацию @Transactional :
@Test public void givenNoTransactional_whenCheckingForActiveTransaction_thenReceiveFalse() { assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); }
4. Использование Весеннего ведения журнала транзакций
Возможно, нам не нужно программно обнаруживать транзакцию. Если мы предпочитаем просто видеть, когда происходит транзакция в журналах нашего приложения, мы можем включить журналы транзакций Spring в нашем файле свойств :
logging.level.org.springframework.transaction.interceptor = TRACE
Как только мы включим этот уровень ведения журнала, начнут появляться журналы транзакций:
2020-10-02 14:45:07,162 TRACE - Getting transaction for [com.Class.method] 2020-10-02 14:45:07,273 TRACE - Completing transaction for [com.Class.method]
Эти журналы не будут предлагать очень полезную информацию без какого-либо контекста. Мы можем просто добавить некоторые из наших собственных журналов, и мы легко сможем увидеть, где происходят транзакции в нашем коде, управляемом Весной.
5. Заключение
В этой статье мы рассмотрели, как проверить, активна ли транзакция Spring. Мы узнали, как программно обнаруживать транзакции с помощью метода TransactionSynchronizationManager.isActualTransactionActive () . Мы также узнали, как включить внутреннее ведение журнала транзакций Spring, если мы хотим видеть транзакции в наших журналах.
Как всегда, примеры кода можно найти на GitHub .