1. 概要

トランザクションの検出は、監査目的や、適切なトランザクション規則が実装されていない複雑なコードベースの処理に役立つ可能性があります。

この簡単なチュートリアルでは、コード内のSpringトランザクションを検出するためのいくつかの方法について説明します。

2. トランザクション構成

Springでトランザクションを機能させるには、トランザクション管理を有効にする必要があります。 spring-data-*またはspring-tx依存関係を持つSpring Bootプロジェクトを使用している場合、Springはデフォルトでトランザクション管理を有効にします。 それ以外の場合は、トランザクションを有効にして、トランザクションマネージャーを明示的に提供する必要があります。

まず、@EnableTransactionManagementアノテーションを@Configurationクラスに追加する必要があります。 これにより、Springのプロジェクトのアノテーション駆動型トランザクション管理が可能になります。

次に、PlatformTransactionManagerまたはReactiveTransactionManagerBeanのいずれかを提供する必要があります。 この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の内部トランザクションログを有効にする方法も発見しました。

いつものように、コード例はGitHubにあります。