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 .