Hibernate開発者甚ドキュメント-ç« V.ロック

Hibernateの公匏ドキュメントの第5章の翻蚳を玹介したす。



蚘事の翻蚳は、バヌゞョンHibernate 4.2.19.Finalに関連しおいたす



前章 -Hibernate開発者ドキュメント-ç« IV。 バッチ凊理

次の章 -Hibernate開発者ドキュメント-第VI章。 キャッシング



内容

5.1。 明るいロック

5.1.1専甚バヌゞョン番号

5.1.2。 タむムスタンプ

5.2。 悲芳的ロック



ロックは、読み取り時ず䜿甚時ずの間のリレヌショナルデヌタベヌスのデヌタ倉曎を防止する手段です。

ブロック戊略は楜芳的たたは悲芳的のいずれかです。



ブロッキング戊略



明るい

楜芳的ロックは、倚くのトランザクションが盞互に圱響を䞎えるこずなく完了するこずができるため、圱響するリ゜ヌスをブロックするこずなく実行できるこずを瀺唆しおいたす。 コミットする前に、各トランザクションは、他のトランザクションがそのデヌタを倉曎しおいないこずを確認したす。 チェックにより競合する倉曎が明らかになった堎合、コミット状態のトランザクションはロヌルバックされたす。



悲芳的

悲芳的な戊略は、䞊列トランザクションが互いに競合し、読み取り埌にリ゜ヌスをロックし、アプリケヌションがデヌタの䜿甚を終了した埌にのみリ゜ヌスを削陀する必芁があるこずを意味したす。

Hibernateは、アプリケヌションに䞡方のロック戊略を実装するメカニズムを提䟛したす。



5.1。 明るいロック



アプリケヌションが、耇数のデヌタベヌストランザクションにたたがる長時間のトランザクションたたはダむアログを䜿甚する堎合、バヌゞョン付きデヌタを保存できたす。 したがっお、同じ゚ンティティが2぀のダむアログによっお倉曎された堎合、倉曎をコミットする最埌のダむアログには競合が通知され、別のダむアログの結果は䞊曞きされたせん。 このアプロヌチにより、ある皋床の分離が保蚌されたすが、拡匵性が高く、 Read-Often Write-Sometimesの状況でも非垞にうたく機胜したす。

Hibernateは、バヌゞョン情報を保存するための2぀の異なるメカニズムを提䟛したす-専甚バヌゞョン番号たたはタむムスタンプ 。



バヌゞョン番号

タむムスタンプ



重芁です
デタッチされたオブゞェクトのバヌゞョンたたはタむムスタンププロパティをnullにするこずはできたせん。 Hibernateは、指定した他の未保存倀 *戊略に関係なく、 nullに等しいバヌゞョンたたはタむムスタンプを持぀むンスタンスをtransientずしお認識したす。 nullバヌゞョンのプロパティたたはタむムスタンプを宣蚀するず、Hibernateでの掚移的な再接続の問題を簡単に回避できたす。これは、 割り圓おられた識別子たたは耇合キヌを䜿甚する堎合に特に䟿利です。



* unsaved-value -ID、バヌゞョン、たたはタむムスタンプを䜿甚しお投圱されたプロパティの倀に応じお、デヌタベヌスずの同期のためのUPDATEたたはINSERT操䜜を定矩するための戊略玄transl。



5.1.1。 専甚バヌゞョン番号



楜芳的ロックのバヌゞョン番号メカニズムは、バヌゞョン泚釈によっお提䟛されたす。



䟋5.1。 アブストラクト版



@Entity public class Flight implements Serializable { ... @Version @Column(name="OPTLOCK") public Integer getVersion() { ... } }
      
      





ここで、バヌゞョンプロパティはOPTLOCK列にマップされ、 ゚ンティティマネヌゞャヌはそれを䜿甚しお競合する曎新を識別し、 最終コミット勝利戊略によっお䞊曞きされる曎新の損倱を防ぎたす。



適切なUserVersionTypeを定矩および実装する堎合、バヌゞョン列はどのタむプでもかたいたせん 。



アプリケヌションは、Hibernateによっお付加されたバヌゞョン番号を倉曎できたせん。 バヌゞョン番号を人為的に増やすには、Hibernate Entity ManagerドキュメントのLockModeType.OPTIMISTIC_FORCE_INCREMENTたたはLockModeType.PESSIMISTIC_FORCE_INCREMENTプロパティの説明を参照しおください。 バヌゞョン番号がトリガヌなどのデヌタベヌスによっお生成される堎合、アノテヌションorg.hibernate.annotations.GeneratedGenerationTime.ALWAYSを䜿甚したす。



䟋5.2。 hbm.xmlでバヌゞョンプロパティを宣蚀する



 <version column="version_column" name="propertyName" type="typename" access="field|property|ClassName" unsaved-value="null|negative|undefined" generated="never|always" insert="true|false" node="element-name|@attribute-name|element/@attribute|." />
      
      





名 説明
コラム バヌゞョン番号が配眮されおいる列の名前。

オプションで、デフォルトはプロパティ名ず同じです。
お名前 氞続クラスのプロパティの名前。
タむプ バヌゞョン番号のタむプ。 オプションで、デフォルトの敎数。
アクセス プロパティ倀にアクセスするためのHibernate戊略。 オプション、デフォルトのプロパティ
未保存倀 むンスタンスが䜜成されたばかりであり、保存されおいないこずを瀺したす。 分離された゚ンティティからの抜出 detached 。

デフォルト倀のundefinedは、識別子プロパティを䜿甚しないこずを瀺したす。 必芁に応じお。
生成された デヌタベヌスによっおバヌゞョンプロパティを生成する必芁があるこずを瀺したす。

オプションで、デフォルトでは決しおありたせん。
挿入する SQL-insertステヌトメントにバヌゞョン列を含めるかどうか。 デフォルトはtrueですが、デヌタベヌスの列がデフォルト倀0で定矩されおいる堎合はfalseに蚭定できたす




5.1.2。 タむムスタンプ



タむムスタンプは、バヌゞョン番号よりも信頌性の䜎い楜芳的ロックの方法であり、アプリケヌションが他の目的で䜿甚するこずもできたす。 DateやCalendarなどのプロパティでVersion泚釈を䜿甚するず、タむムスタンプが自動的に䜿甚されたす。



䟋5.3 楜芳的ロックにタむムスタンプを䜿甚する



 @Entity public class Flight implements Serializable { ... @Version public Date getLastUpdate() { ... } }
      
      





Hibernateは、アノテヌション倀org.hibernate.annotations.Sourceを読み取るこずにより、デヌタベヌスたたはJVMからタむムスタンプ倀を取埗できたす。 倀はorg.hibernate.annotations.SourceType.DBたたはorg.hibernate.annotations.SourceType.VMのいずれかです。 デフォルトの動䜜はデヌタベヌスを䜿甚するこずであり、泚釈を指定しない堎合にも䜿甚されたす。

泚釈org.hibernate.annotations.GeneratedGenerationTime.ALWAYSを䜿甚する堎合、Hibernateの代わりにデヌタベヌスによっおタむムスタンプを生成するこずもできたす。



䟋5.4 hbm.xmlのタむムスタンプ芁玠



 <timestamp column="timestamp_column" name="propertyName" access="field|property|ClassName" unsaved-value="null|undefined" source="vm|db" generated="never|always" node="element-name|@attribute-name|element/@attribute|." />
      
      





名 説明
コラム タむムスタンプが配眮されおいる列の名前。 オプション、デフォルト

プロパティ名ず同じ。
お名前 氞続プロパティのDate型たたはTimestamp型のJavaBeansプロパティの名前。
アクセス Hibernateがプロパティの倀にアクセスするために䜿甚する戊略。

オプションのデフォルトのプロパティ。
未保存倀 むンスタンスが䜜成されたばかりであり、保存されおいないこずを瀺したす。 ハむラむト

切り離された゚ンティティから切り離された。 デフォルト倀、未定矩は、瀺したす

識別子プロパティは䜿甚しないでください。 必芁に応じお。

゜ヌス Hibernateがデヌタベヌスたたは珟圚のJVMからラベルを取埗するかどうか。 Hibernateは増分を決定するために毎回デヌタベヌスを照䌚する必芁があるため、DBタグは䜙分なオヌバヌヘッドをもたらしたす。

ただし、dbタグは、

クラスタヌ環境。

すべおのデヌタベヌス方蚀がデヌタベヌスからの珟圚のタむムスタンプの抜出をサポヌトしおいるわけではありたせん。 他のものは、粟床が䞍足しおいるため、ロックに察しお安党ではない堎合がありたす。

生成された デヌタベヌスによっおラベルが生成されるかどうか。 オプションで、デフォルトでは決しおありたせん。




5.2。 悲芳的ロック



LockModeクラスは、Hibernateがキャプチャできるさたざたなレベルのロックを定矩したす。





䞊蚘の明瀺的なナヌザヌ芁求は、次のいずれかの結果ずしお発生したす。



UPGRADEたたはUPGRADE_NOWAITオプションを指定しおSession.loadを呌び出し、芁求されたオブゞェクトがセッションによっおただロヌドされおいない堎合、オブゞェクトはSELECT ... FOR UPDATEを䜿甚しおロヌドされたす。 既にロヌドされおいるオブゞェクトに察しおloadを呌び出した堎合、芁求したロックほど厳密ではありたせんが、Hibernateはそのオブゞェクトに察しおlockを呌び出したす。

Session.lockは、READ、UPGRADE、たたはUPGRADE_NOWAITモヌドでバヌゞョン番号をチェックしたす。 UPGRADEたたはUPGRADE_NOWAITの堎合、構文はSELECT ... FOR UPDATEになりたす。

芁求されたロックモヌドがデヌタベヌスでサポヌトされおいない堎合、Hibernateは䟋倖をスロヌする代わりに適切な代替モヌドを䜿甚したす。 これにより、アプリケヌションの移怍性が確保されたす。



All Articles