檢測Spring事務是否處於活動狀態

1.概述

檢測事務對於審計目的或在未實施良好事務約定的複雜代碼庫中可能有用。

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

2.事務配置

為了使事務在Spring中工作,必須啟用事務管理。如果我們使用帶有spring-data- *或spring-tx依賴項的Spring Boot項目,則默認情況下,Spring將啟用事務管理。否則,我們將必須啟用事務並顯式提供事務管理器。

首先,我們需要在@Configuration類中@EnableTransactionManagement批註。這將為我們的項目啟用Spring的註釋驅動的事務管理。

接下來,我們必須提供PlatformTransactionManagerReactiveTransactionManager bean。這個bean需要一個DataSource 。我們可以選擇使用許多常見的庫,例如H2或MySQL的庫。對於本教程,我們的實現無關緊要。

一旦啟用事務,就可以使用@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事務日誌

也許我們不需要以編程方式檢測交易。如果我們只希望在應用程序的日誌中看到事務何時發生,則可以在屬性文件中啟用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事務是否處於活動狀態。我們學習瞭如何使用TransactionSynchronizationManager.isActualTransactionActive()方法以編程方式檢測事務。我們還發現瞭如何啟用Spring的內部事務日誌記錄,以防我們希望在日誌中看到事務。