检测 Spring 事务是否处于活动状态

1、概览

本文将带你了解在代码中检测 Spring 事务的几种方法。

2、事务配置

要在 Spring 中运行事务,必须启用事务管理。如果使用的是Spring Boot 项目,并且依赖了 spring-data-spring-tx,Spring 会默认启用事务管理。否则,必须手动启用事务并明确提供事务管理器(Transaction Manager)。

首先,需要在 @Configuration 类中添加 @EnableTransactionManagement 注解。这样,在项目中就可以使用 Spring 注解驱动的事务管理了。

接下来,必须提供 PlatformTransactionManagerReactiveTransactionManager Bean。该 Bean 需要一个数据源。可以选择使用一些常用库,如 H2MySQL 库。这不是本文的重点。

启用事务后,就可以使用 @Transactional 注解来开启事务。

3、TransactionSynchronizationManager

Spring 提供了一个名为 TransactionSychronizationManager 的类。该类有一个名为 isActualTransactionActive() 的静态方法可以让我们知道自己是否处于事务。

测试如下,用 @Transactional 注解一个测试方法。在方法中断言 isActualTransactionActive() 返回 true

@Test
@Transactional
public void givenTransactional_whenCheckingForActiveTransaction_thenReceiveTrue() {
    assertTrue(TransactionSynchronizationManager.isActualTransactionActive());
}

同样,删除 @Transactional 注解时,测试应断言返回 false

@Test
public void givenNoTransactional_whenCheckingForActiveTransaction_thenReceiveFalse() {
    assertFalse(TransactionSynchronizationManager.isActualTransactionActive());
}

4、Spring 事务日志

也许你并不需要以编程式的方式来检测事务,可能只是想在应用的日志中查看事务发生的时间,可以在 properties 文件中启用 Spring 的事务日志:

logging.level.org.springframework.transaction.interceptor = TRACE

设置为 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 Boot 中通过 TransactionSynchronizationManager.isActualTransactionActive() 方法以编程式的方式检测事务,以及如何开启 TRACE 级别的事务日志记录。


Ref:https://www.baeldung.com/spring-transaction-active