[解決済み] Spring @Transactional - 分離、伝搬
質問
を説明できる人がいますか?
アイソレーション
&です。
伝搬
パラメータは
@Transactional
アノテーションの実例を介して?
基本的に、いつ、なぜ、そのデフォルト値を変更することを選択すべきなのでしょうか。
どのように解決するのですか?
良い質問ですね、でも答えるのは簡単なことではありません。
伝搬
トランザクションが互いにどのように関連しているかを定義する。一般的なオプション。
-
REQUIRED
: コードは常にトランザクションの中で実行されます。新しいトランザクションを作成するか、利用可能であれば再利用します。 -
REQUIRES_NEW
: コードは常に新しいトランザクションで実行されます。現在のトランザクションが存在する場合、それを一時停止します。
のデフォルト値は
@Transactional
は
REQUIRED
そして、これはしばしばあなたが望むことです。
分離
トランザクション間のデータコントラクトを定義する。
-
ISOLATION_READ_UNCOMMITTED
: ダーティリードを許可します。 -
ISOLATION_READ_COMMITTED
: ダーティリードを許可しない。 -
ISOLATION_REPEATABLE_READ
: 同じトランザクションで行を2回読み込んでも、結果は常に同じになります。 -
ISOLATION_SERIALIZABLE
: すべてのトランザクションを順番に実行します。
異なるレベルは、マルチスレッド・アプリケーションにおいて異なるパフォーマンス特性を持ちます。を理解すれば、そのようなことはないと思います。 ダーティリード の概念を理解すれば、良い選択肢を選ぶことができるはずです。
デフォルトはデータベースの違いにより異なる場合があります。例として
マリアDB
である。
REPEATABLE READ
.
ダーティリードが発生する場合の例。
thread 1 thread 2
| |
write(x) |
| |
| read(x)
| |
rollback |
v v
value (x) is now dirty (incorrect)
したがって、まともなデフォルト(と主張できる場合)は、次のようになります。
ISOLATION_READ_COMMITTED
これは、他の実行中のトランザクションによって既にコミットされた値のみを読み取ることができるもので、伝搬レベルとして
REQUIRED
. そして、アプリケーションに他のニーズがある場合は、そこから作業することができます。
を入力すると、常に新しいトランザクションが作成される実例です。
provideService
ルーチンを終了し、退出するときに完了します。
public class FooService {
private Repository repo1;
private Repository repo2;
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void provideService() {
repo1.retrieveFoo();
repo2.retrieveFoo();
}
}
もし代わりに
REQUIRED
の場合、トランザクションは
は開いたままです。
ルーチンに入るときにすでにトランザクションが開いていた場合。
また、ルーチンに入った時に既にトランザクションが開いていた場合、そのトランザクションの結果は
rollback
は、複数の実行が同じトランザクションに参加する可能性があるため、異なる可能性があります。
テストで動作を確認し、伝搬レベルによって結果がどのように異なるかを簡単に確認することができます。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:/fooService.xml")
public class FooServiceTests {
private @Autowired TransactionManager transactionManager;
private @Autowired FooService fooService;
@Test
public void testProvideService() {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
fooService.provideService();
transactionManager.rollback(status);
// assert repository values are unchanged ...
}
プロパゲーションレベルが
-
REQUIRES_NEW
を期待します。fooService.provideService()
でした NOT は、独自のサブトランザクションを作成したため、ロールバックされました。 -
REQUIRED
: すべてがロールバックされ、バッキングストアは変更されないと予想されます。
関連
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
IllegalArgumentException この例外を解決する方法
-
[解決済み] JVM起動時のパラメータ「-Xms」「-Xmx」とは何ですか?
-
Dateが型に解決できない問題を解決する
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
linux run jarfile Invalid or corrupt jarfile error.
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] Javaにおけるチェック済み例外とチェックされていない例外の理解
-
[解決済み】Spring - @Transactional - バックグラウンドで何が起こっているのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
javaの模造品QQ WeChatのチャットルーム
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
HttpClientがGZIP形式でない場合の対処法
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
このラインで複数のマーカーを解決する方法
-
[解決済み] HibernateのopenSession()とgetCurrentSession()の比較