[解決済み] トランザクションの分離レベルとテーブルのロックの関係
質問
4つの絶縁レベルについて読んだことがあります。
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --
理解したい 各トランザクションの分離がテーブルに対して取るロック
READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)
トランザクション分離の際に起こりうる3つの現象は以下の通りです。
ダーティリード
- ロックなし
繰り返し不可能な読み取り
- コミットされたデータをロックするため、ダーティリードがない
ファントムリード
- selectクエリで選択されたSQLのブロックをロックする。
私は理解したい これらの分離レベルは、jdbc/hibernateレベルのみか、DB内でも定義できるのでしょうか?
PS: 私は、以下のリンクに目を通しました。 オラクルにおける分離レベル のリンクも見てみましたが、不器用そうだし、データベース固有の話もありそうです。
どのように解決するのですか?
<ブロッククオート理解したい 各トランザクションの分離がテーブルに対して取るロック
例えば、A、B、Cの3つのプロセスが同時進行しているとします。Aはトランザクションを開始し、データを書き込み、コミット/ロールバック(結果に応じて)します。Bはただ
SELECT
ステートメントを実行し、データを読み込む。Cはデータの読み込みと更新を行う。これらの処理はすべて同じテーブルTに対して行われます。
- 未コミットの読み込み - テーブルをロックしていません。テーブルに書き込みをしながら、テーブルのデータを読み込むことができる。つまり、Aが(コミットされていない)データを書き込み、Bはこのコミットされていないデータを読み込んで(どんな目的でも)使用することができる。Aがロールバックを実行しても、Bはそのデータを読んで使用したことになる。これは最も速い方法ですが、物理的に関連していないテーブルのデータホールにつながるため、データを扱うのに最も安全でない方法です(実際のアプリケーションでは、2つのテーブルが論理的に関連しても、物理的に関連しないことがあります)。
- READ COMMITTED - はコミットされたデータをロックします。コミットされただけのデータを読むことができる。つまり、Aがデータを書き込み、BはAがコミットを実行するまでAが保存したデータを読めません。ここで問題なのは、CがBに読み込まれ使用されたデータを更新することができ、Bのクライアントは更新されたデータを持つことができなくなることです。
-
繰り返し読み出し
- SQLのブロック(selectクエリで選択されたもの)をロックします。これは、Bがある条件下でデータを読み込むことを意味します。
WHERE aField > 10 AND aField < 20
Aがデータを挿入する場合aField
の値が 10 と 20 の間にあるデータを挿入し、B はそのデータを再度読み込んで異なる結果を得ます。 - SERIALIZABLE - はフルテーブル(Selectクエリが発行されるテーブル)をロックします。つまり、Bはデータを読み込んで 他のトランザクションがデータを変更することはできません。 を変更できないことを意味します。これは最も安全な方法ですが、データを扱うのに最も遅い方法です。また、単純な読み取り操作でロックされるため テーブルを TテーブルがInvoiceテーブルで、ユーザーXがその日のinvoiceを知り、ユーザーYが新しいinvoiceを作成したいと想像してみてください。
理解したい これらの分離レベルを定義する場所:JDBC/hibernateレベルのみ、またはDBでも。
JDBCを使用する場合、以下の方法で定義します。
Connection#setTransactionIsolation
.
Hibernateを使用します。
<property name="hibernate.connection.isolation">2</property>
ここで
- 1: コミットされない読み取り
- 2: コミット済み読み込み
- 4: 繰り返し読み出し
- 8: シリアライズ可能
Hibernateの設定は ここで (から取得しています(すみません、スペイン語です)。
ちなみに、RDBMSでもアイソレーションレベルを設定することができます。
- MySQL の分離レベル ,
- SQL Server の分離レベル
-
Informix の分離レベル
(個人的なメモ: 私は、忘れもしない
SET ISOLATION TO DIRTY READ
の文は忘れられません)
といった具合に...
関連
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
executeQuery()でデータ操作文が発行できない。解決方法
-
-bash: java: コマンドが見つからない 解決方法
-
Junitのユニットテストはjava.lang.Testを報告します。
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
java 365*1000*60*60*24 計算問題
-
テストが空であるかどうかを判断するためのオプションの処理
-
[解決済み】Non-Repeatable ReadとPhantom Readの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
executeQuery()でデータ操作文が発行できない。解決方法
-
プロジェクトの依存関係を解決できない。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
強制型変換について
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
[解決済み] JPA/Hibernateにおけるflush()の正しい使い方