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 的內部事務日誌記錄,以便在日誌中查看事務。