Рубрики
Без рубрики

Определение Того, Активна Ли Транзакция Spring

Давайте посмотрим, как мы можем определить, активна ли транзакция Spring.

Автор оригинала: 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 .