ホームページ >Java >&#&チュートリアル >@Transactional のデフォルトの分離パラメータと伝播パラメータを調整する必要があるのはいつ、なぜですか?

@Transactional のデフォルトの分離パラメータと伝播パラメータを調整する必要があるのはいつ、なぜですか?

DDD
DDDオリジナル
2024-11-03 19:56:02697ブラウズ

When and Why Should You Adjust the Default Isolation and Propagation Parameters in @Transactional?

@Transactional の分離パラメーターと伝播パラメーター

Spring の @Transactional アノテーションでは、分離と伝播という 2 つの重要なパラメーターがデータベース トランザクションの動作を定義します。 。この記事では、デフォルト値の調整を検討する必要がある場合とその理由について説明します。

伝播

伝播は、トランザクションが相互にどのように関連するかを定義します。一般的なオプションは次のとおりです。

  • REQUIRED: 既存のトランザクション内でコードを実行するか、存在しない場合は新しいトランザクションを作成します。
  • REQUIRES_NEW: 常に新しいトランザクションを作成し、既存のトランザクションを一時停止します。

デフォルト値: 必須

分離

分離は、トランザクション間のデータ コントラクトを定義します。他のトランザクションによるデータ変更の可視性レベルを指定することで、特定のデータの不整合を防ぎます。主要な分離レベルは次のとおりです。

  • READ_UNCOMMITTED: ダーティ リードに対する保護なし。
  • SERIALIZABLE: 最も強力な分離で、データの競合がないことを保証します。

デフォルト値: データベースによって異なります (例: MariaDB の REPEATABLE_READ)

実際の例

トランザクションが別のトランザクションによって行われたコミットされていない変更を読み取ることができるダーティ リードの問題を考えてみましょう。

                                       Thread 1          Thread 2
                                               |              |
                                             Write(x)           |
                                               |              |
                                               |             Read(x)
                                               |              |
                                             Rollback           |
                                                 |             |
                                                   Value (x) is now dirty (incorrect)

このシナリオでは、ダーティ リードを防ぐために、分離レベルを READ_COMMITTED に設定できます。 、伝播レベルは 必須。この組み合わせにより、トランザクションは他のトランザクションによってコミットされたデータのみを読み取ることが保証されます。

トランザクションのカスタマイズ

次の例では、provideService メソッドは常に新しいトランザクション内で実行され、他の同時タスクによる変更がその実行に干渉しないようにします。

<code class="java">@Transactional(propagation=Propagation.REQUIRES_NEW)
public void provideService() {
    repo1.retrieveFoo();
    repo2.retrieveFoo();
}</code>

トランザクション動作のテスト

さまざまな伝播レベルの動作については、Java テストを使用できます。

<code class="java">@Test
public void testProvideService() {
    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    fooService.provideService();
    transactionManager.rollback(status);
    // Assert repository values are unchanged ...
}</code>

REQUIRES_NEW を使用すると、fooService.provideService() は動作したためロールバックされません。別のトランザクション内で。 REQUIRED を指定すると、すべてがロールバックされます。

以上が@Transactional のデフォルトの分離パラメータと伝播パラメータを調整する必要があるのはいつ、なぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。