如何检测Spring中事务当前是否活着? - Baeldung


检测交易对于审计目的或在未实施良好交易惯例的复杂代码库中可能有用。在这个简短的教程中,我们将介绍几种方法来检测代码中的Spring事务。
为了使事务在Spring中工作,必须启用事务管理。如果我们使用具有spring-data- *或spring-tx依赖项的Spring Boot项目,则会在默认情况下,Spring才将启用事务管理。否则,我们将必须启用事务并显式提供事务管理器:

  1. 首先,我们需要在@Configuration类中添加@EnableTransactionManagement。这将为我们的项目启用Spring的注释驱动的事务管理。
  2. 接下来,我们必须提供PlatformTransactionManager或ReactiveTransactionManager bean。该bean需要一个DataSource。我们可以选择使用许多常见的库,例如H2或MySQL的库。对于本教程,我们的实现无关紧要。
  3. 一旦启用事务,就可以使用@Transactional批注来生成事务。

 
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());
}

 
也许我们不需要以编程方式检测事务。如果我们只想在应用程序的日志中看到事务何时发生,则可以在属性文件中启用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管理的代码中看到事务发生的位置。
 

在本文中,我们看到了如何检查Spring事务是否处于活动状态。我们学习了如何使用TransactionSynchronizationManager.isActualTransactionActive()方法以编程方式检测事务。我们还发现了如何启用Spring的内部事务记录功能,以防我们希望在日志中看到事务。
与往常一样,可以在GitHub上找到代码示例。