@Transactional の分離パラメーターと伝播パラメーター
Spring の @Transactional アノテーションでは、分離と伝播という 2 つの重要なパラメーターがデータベース トランザクションの動作を定義します。 。この記事では、デフォルト値の調整を検討する必要がある場合とその理由について説明します。
伝播
伝播は、トランザクションが相互にどのように関連するかを定義します。一般的なオプションは次のとおりです。
デフォルト値: 必須
分離
分離は、トランザクション間のデータ コントラクトを定義します。他のトランザクションによるデータ変更の可視性レベルを指定することで、特定のデータの不整合を防ぎます。主要な分離レベルは次のとおりです。
デフォルト値: データベースによって異なります (例: 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 サイトの他の関連記事を参照してください。