hibernateトランザクションの同時実行

4399 ワード

データベース・トランザクションと同時実行
概要:トランザクションは、独立性レベル制御ロックの形式でデータの同時問題を処理します.
トランザクションが同時問題を処理できるのはなぜですか?
答:トランザクションの特性は、一貫性、隔離性、持続性、原子性の同時問題を処理できることを決定します.
データの同時実行にはどのような状況がありますか?
回答:
一、後に発生した事務が前の事務に影響する
1.第1クラスの更新が失われた:後に発生したトランザクションのロールバックは、前にコミットされた正常なトランザクションを上書きした
2、ダーティリード:後に発生したトランザクションは、前のロールバックを上書きしたトランザクションを正常にコミットしました.
3、第2類の更新が失われた:後に発生した取引が正常に提出され、前の正常に提出された取引が上書きされた
二、後に発生した事務は前の事務の影響を受ける
1、虚読:後の取引は前後2回データを読み取る時、前の提出した取引によって挿入操作を行った.
データ統計の前後が一致しないようにします.
2、繰り返し不可:後の取引は同じデータの前後2回の読み取り時に前のコミットされた取引のため
このデータを更新し、データの前後が一致しないようにしました.
トランザクションは同時問題をどのように処理しますか?
回答:
トランザクションがロックによって同時問題を処理するには、一般的に2つの方法があります.
悲観的なロック:データベース・システムのロックによる同時処理
楽観的なロック:アプリケーションの論理処理による同時実行
悲観的なロックの種類はどれらがありますか?
回答:
一、共有ロック:データを読み取る操作に用いる.
機能:
1、ロック条件:1つのトランザクションがselect文を実行すると、データベースシステムはこのトランザクションに共有ロックを割り当て、クエリーされたレコードをロックします.
2、ロック解除条件:読み終わったら共有ロックを解除する.
3、互換性:データリソースに共有ロックがかかっている場合は、共有ロックと更新ロックを置くこともできます.
4、同時性能:良好な同時性能を持つ.
二、更新ロック:更新操作の初期化段階で修正される可能性のあるリソースをロックし、共有ロックの使用によるデッドロックの問題を避ける.
機能:
1、ロック条件:トランザクションがupdate文を実行すると、データベース・システムはトランザクションに更新ロックを割り当てます.
2、ロック解除条件:データの読み込みが完了し、更新操作を行う時、更新ロックを独占ロックにアップグレードする.
3、互換性:共有ロックと互換性がある.1つのデータ・リソースに複数の共有ロックと1つの更新ロックがあります.
4、複数のトランザクションがロックされたリソースを同時に読み込むことは許可されますが、他のトランザクションは変更できません.
三、排他ロック:データを修正する時に排他ロックを使う.
機能:
1、ロック条件:update、delete、insert操作を実行すると、データベースシステムはデータリソースに独占ロックを使用する.リソースに他のロックがある場合
存在する場合は、排他ロックを配置できません
2、ロック解除条件:トランザクションが終了するまで排他ロックが解除されません.
3、互換性:排他ロックは他のロックと互換性がない.
4、同時性:同時性が悪い.
トランザクションはどのようにロックの形式を制御しますか?
答え:トランザクションは、トランザクションの独立性レベルによってロックの形式を制御します.
トランザクション・レベルはどれですか?合併状況はどうですか.
回答:
独立性レベル
第1クラスの失われた更新が発生したかどうか
ダーティリードの有無
虚読の有無
繰り返し不可能な読み取りが発生したかどうか
第2クラスの失われた更新が発生したかどうか
Serializable
いいえ
いいえ
いいえ
いいえ
いいえ
Repeatable Read
いいえ
いいえ
はい
いいえ
いいえ
Read Commited
いいえ
いいえ
はい
はい
はい
Read Uncommited
いいえ
はい
はい
はい
はい
 
アプリケーションで楽観的なロックを使用する方法:
 
答え:通常、データベーステーブルにVersionまたはTimeStampフィールドを追加し、読み込み時および修正操作時のVersionまたはTimeStampの値に応じて同時問題を制御します.
Hibernateは同時問題をどのように処理しますか.
回答:
一、Hibernateはデータを読み取る時にロックモードを設定することによって悲観ロックの形式を制御する
ロックモード
説明
LockMode.NONE
指定されたオブジェクトがHibernateのキャッシュに存在する場合は、そのオブジェクトの参照を直接返します.そうでない場合は、Select文を使用してオブジェクトをデータベースにロードします.これがデフォルトです
LockMode.Read
指定されたオブジェクトがHibernateのキャッシュに存在するかどうかにかかわらず、常にselect文を使用してデータベースにロードされます.マッピング・ファイルにバージョン要素が設定されている場合は、バージョンチェックを実行し、キャッシュ内の指定したオブジェクトがデータベース内のバージョンと一致しているかどうかを比較します.
LockMode.UPGRADE
指定されたオブジェクトがHibernateのキャッシュに存在するかどうかにかかわらず、常にselect文を使用してデータベースにロードされます.マッピング・ファイルにバージョン要素が設定されている場合は、バージョンチェックを実行し、キャッシュ内の指定したオブジェクトがデータベース内のバージョンと一致しているかどうかを比較します.データベース・システムが悲観的なロックをサポートしている場合はselectを実行します.のfor update文は、データベースシステムが悲観的なロックをサポートしていない場合、通常のselect文を実行します.
LockMode.UPGRADE_NOWAIT
ロック・モードとUPGRADEは同様の機能を有する.また、Oracleデータベースでselectを実行します.for update nowait文.
LockMode.WRITE
このモードは、Hibernateがデータベースにオブジェクトを保存または更新するときに自動的に使用されます.このモードはHibernate内部でのみ使用できます.
 
二、Hibernateはマッピングファイルの中で楽観的なロックを使って同時問題を処理する
 
1、要素:この要素で指定されたフィールドは、1回の操作ごとに自動的に1が加算され、読み込みと修正操作の際にversion値が異なると例外が投げ出され、アプリケーション処理に渡されます.
<id name="id" type="long" column="ID">
    <generator class="increment"/>
</id>
<version name="version" column="VERSION"/>

の後ろに続く必要があります
2、要素:この要素で指定したフィールドデータは、1回の操作ごとに現在時刻に更新されます.現在の時間は正確で優れているため,同時問題を処理する精度にはが優れていない.
注意:この2つの要素は、要素の後ろに続くように使用されます.
<id name="id" type="long" column="ID">
    <generator class="increment"/>
</id>
<timestamp name="lastUpdatedTime" column="LAST_UPDATED_TIME"/>
 
の後ろに続く必要があります
3、既存のデータベーステーブルにversionまたはtimestampフィールドが含まれていない場合、コンカレントの問題を処理するには要素で次のように設定します.
次の方法は同じセッションの下で有効でなければならないので、あまり役に立たない!
<class name=”Account” table=”Accounts” optimistic-lock=”all” dynamic-update=”true”>