«1. Обзор
Обнаружение транзакций может быть полезно для целей аудита или для работы со сложной кодовой базой, где не реализованы хорошие соглашения о транзакциях.
В этом кратком руководстве мы рассмотрим несколько способов обнаружения транзакций Spring в нашем коде.
2. Конфигурация транзакций
Чтобы транзакции работали в Spring, необходимо включить управление транзакциями. Spring по умолчанию включит управление транзакциями, если мы используем проект Spring Boot с зависимостями spring-data-* или spring-tx. В противном случае нам придется включить транзакции и явно указать диспетчер транзакций.
Во-первых, нам нужно добавить аннотацию @EnableTransactionManagement в наш класс @Configuration. Это позволяет управлять транзакциями Spring на основе аннотаций для нашего проекта.
Далее мы должны предоставить bean-компонент PlatformTransactionManager или ReactiveTransactionManager. Для этого bean-компонента требуется DataSource. Мы могли бы использовать ряд общих библиотек, например, для H2 или MySQL. Наша реализация не имеет значения для этого урока.
После включения транзакций мы можем использовать аннотацию @Transactional для генерации транзакций.
3. Использование TransactionSynchronizationManager
Spring предоставил класс TransactionSychronizationManager. К счастью, в этом классе есть статический метод 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 Transaction Logging
Возможно нам не нужно программно обнаруживать транзакцию. Если мы хотим просто видеть, когда транзакция происходит в журналах нашего приложения, мы можем включить журналы транзакций 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]
~~ ~ Эти журналы не предоставят очень полезной информации без какого-либо контекста. Мы можем просто добавить некоторые из наших собственных журналов, и мы легко сможем увидеть, где происходят транзакции в нашем коде, управляемом Spring.
5. Заключение
В этой статье мы увидели, как проверить, активна ли транзакция Spring. Мы узнали, как программно обнаруживать транзакции с помощью метода TransactionSynchronizationManager.isActualTransactionActive(). Мы также узнали, как включить внутреннее ведение журнала транзакций Spring, если мы хотим видеть транзакции в наших журналах.
Как всегда, примеры кода можно найти на GitHub.