Перейти к основному содержимому

Обнаружение активности транзакции Spring

· 2 мин. чтения

1. Обзор

Обнаружение транзакций может быть полезно для целей аудита или для работы со сложной кодовой базой, где не реализованы хорошие соглашения о транзакциях.

В этом кратком руководстве мы рассмотрим несколько способов обнаружения транзакций Spring в нашем коде.

2. Конфигурация транзакции

Чтобы транзакции работали в Spring, необходимо включить управление транзакциями. Spring по умолчанию включит управление транзакциями, если мы используем проект Spring Boot с зависимостями spring-data-* или spring-tx . В противном случае нам придется включить транзакции и явно указать диспетчер транзакций.

Во-первых, нам нужно добавить аннотацию @EnableTransactionManagement в наш класс @Configuration . Это позволяет управлять транзакциями Spring на основе аннотаций для нашего проекта.

Затем мы должны предоставить bean-компонент PlatformTransactionManager или ReactiveTransactionManager . Этот компонент требует 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

Возможно, нам не нужно программно определять транзакцию. Если бы мы хотели просто видеть, когда транзакция происходит в журналах нашего приложения, мы можем включить журналы транзакций 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 .