知識庫 / Spring RSS 訂閱

Spring事務是否活躍檢測

Spring
HongKong
4
12:45 PM · Dec 06 ,2025

1. 概述

檢測事務對於審計目的或處理缺乏良好事務約定,導致代碼庫複雜的情況都可能很有用。

在本簡要教程中,我們將介紹幾種在代碼中檢測 Spring 事務的方法。

2. 事務配置

為了使事務在 Spring 中正常工作,必須啓用事務管理。Spring 如果我們正在使用帶有 spring-data-* 或 spring-tx 依賴項的 Spring Boot 項目,則默認會啓用事務管理。否則,我們需要顯式地啓用事務並提供事務管理器。

首先,我們需要將 <em @EnableTransactionManagement</em> 註解添加到我們的 <em @Configuration</em> 類中。這為我們的項目啓用了 Spring 的基於註解的事務管理。

接下來,我們必須提供一個 <em PlatformTransactionManager</em>><em ReactiveTransactionManager</em> Bean。此 Bean 需要一個 <em DataSource</em>>。我們可以選擇使用許多常用的庫,例如用於 H2 或 MySQL 的庫。在本教程中,我們的實現並不重要。

一旦我們啓用了事務,我們就可以使用 <em @Transactional</em> 註解來生成事務。

3. 使用 TransactionSynchronizationManager

Spring 提供了名為 TransactionSynchronizationManager 的類。 幸運的是,該類提供了一個靜態方法,允許我們知道是否處於事務中,該方法名為 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 事務日誌

也許我們不需要通過編程方式檢測事務。如果更傾向於在應用程序的日誌中查看事務何時發生,我們可以通過在屬性文件中啓用 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 事務是否處於活動狀態。我們通過使用 <em >TransactionSynchronizationManager.isActualTransactionActive()</em > 方法來程序化地檢測事務。此外,我們還了解了如何啓用 Spring 的內部事務日誌記錄,以便在日誌中查看事務。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.