1、概览 {#1概览}
本文将带你了解在代码中检测 Spring 事务的几种方法。
2、事务配置 {#2事务配置}
要在 Spring 中运行事务,必须启用事务管理。如果使用的是Spring Boot 项目,并且依赖了 spring-data-
或 spring-tx
,Spring 会默认启用事务管理。否则,必须手动启用事务并明确提供事务管理器(Transaction Manager)。
首先,需要在 @Configuration
类中添加 @EnableTransactionManagement
注解。这样,在项目中就可以使用 Spring 注解驱动的事务管理了。
接下来,必须提供 PlatformTransactionManager
或 ReactiveTransactionManager
Bean。该 Bean 需要一个数据源。可以选择使用一些常用库,如 H2 或 MySQL 库。这不是本文的重点。
启用事务后,就可以使用 @Transactional
注解来开启事务。
3、TransactionSynchronizationManager {#3transactionsynchronizationmanager}
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 事务日志 {#4spring-事务日志}
也许你并不需要以编程式的方式来检测事务,可能只是想在应用的日志中查看事务发生的时间,可以在 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、总结 {#5总结}
本文介绍了如何在 Spring Boot 中通过 TransactionSynchronizationManager.isActualTransactionActive()
方法以编程式的方式检测事务,以及如何开启 TRACE 级别的事务日志记录。
Ref:https://www.baeldung.com/spring-transaction-active