ホームページ  >  記事  >  Java  >  Springトランザクション分離レベルの詳細説明

Springトランザクション分離レベルの詳細説明

黄舟
黄舟オリジナル
2017-03-03 10:18:451501ブラウズ

Spring では 5 つの異なるトランザクション分離レベルが定義されています:
1. ISOLATION_DEFAULT (通常、この構成を使用できます) ;

これは、databaseデフォルトのトランザクション分離レベルを使用する、PlatfromTransactionManager のデフォルトの分離レベルです。
2. ISOLATION_READ_UNCOMMITTED 4 p" L. I' F; k1 {) a. D( E5 ?: V
これはトランザクションの最も低い分離レベルです。他のトランザクションがこのトランザクションのコミットされていない情報を参照できるようになります。データ。この分離レベルでは、ダーティ読み取り、非反復読み取り、ファントム読み取りが発生します。
これは、ほとんどのデータベースのデフォルトのトランザクション分離レベルでは発生しません) 1 N$ G7 X" U# U6 S/ u' z/ I
3. ISOLATION_READ_COMMITTED
あるトランザクションによって変更されたデータは、送信された後は別のトランザクションによってのみ読み取れるようにします。別のトランザクションは、このトランザクションのコミットされていないデータを読み取ることができません。このトランザクション分離レベルではダーティ読み取りを回避できますが、反復不可能な読み取りやファントム読み取りが発生する可能性があります。 : U8 m# n8 g1 k( E: N
ダーティ リードとは何ですか? (変更とコミットメント解除が原因)
例:
Zhang San の給与は 5000 ですが、トランザクション A では給与が 8000 に変更されますしかし、トランザクション A はまだ送信されていません。同時に、トランザクション B は Zhang San の給与を読み取り、Zhang San の給与が 8000 であることを読み取ります。その後、トランザクション A で例外が発生し、トランザクションはロールバックされます。 5000。最後に、トランザクション B によって読み取られた Zhang San の給与 8000 のデータはダーティ データであり、トランザクション B はダーティ リードを実行しました。この状況は、デフォルトのトランザクションでは発生しません。 ; ただし、ファントム読み取りが発生する可能性があります。 3 [* {- F2 s. w+ |
非反復読み取りとは何ですか? ( 変更の原因
)
6 h2 E% J, S7 f9 n+ m0 U4 ]" ?% e. a 例:
/ ^7 Y# T6 |& Z' B トランザクション A では、Zhang San の給与が 5000 であることが読み取られ、操作は完了していません。トランザクションはまだ送信されていません。 5 K: N6 c" [$ p: J4 L/ I" B
同時に、トランザクション B は Zhang San の給与を 8000 に変更し、トランザクションを送信しました。続いてトランザクションAでZhang Sanさんの給与が再度読み取られ、給与は8,000となります。トランザクション内の 2 つの読み取りの結果に一貫性がなく、反復不可能な読み取りが発生します。 (この状況は、ほとんどのデータベースのデフォルトのトランザクション分離レベルでは発生しません) . h+ U! y9 {) }1 R8 ~% B, l; t
5. これは最も高価ですが、最もコストがかかります。 -effect 信頼性の高いトランザクション分離レベル。トランザクションは順次実行として処理されます。ダーティ リードと非反復読み取りを防止するだけでなく、ファントム リードも回避されます。 % c0 @8 E& g" x1 現在、給与 5,000 の従業員が 10 人います。トランザクション A は、給与 5,000 の従業員 10 人全員を読み取ります。このとき、トランザクション B は給与 5,000 のレコードを挿入します。これは、トランザクション A は、従業員 5,000 人の給与を再度読み取ります。レコードは 11 です。このとき、ファントム読み取りが発生します。この状況は、ほとんどのデータベースのデフォルトのトランザクション分離レベルで発生します。ロック)

_! O3 W6 M/ L 注:
Oracle
データベースのデフォルトのトランザクション分離レベルでは、ダーティ リードと反復不可能な読み取りが確実に回避されていますが、テーブル レベルのロックが発生する可能性があります。これはファントム読み取りを回避するために必要であり、Oracle のデフォルトの行レベルのロックはこれに基づいています。Spring のトランザクション構成では、テーブルレベルのロックを使用するため、トランザクション分離レベルは慎重に使用する必要があります。通常、特別な必要がない場合は、データベースのデフォルトのトランザクション分離レベルを使用するように設定してください。詳細については、Spring トランザクションの分離レベルに注意してください。 PHP 中国語 Web サイト (www.php.cn)

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