2016-07-30 13 views
1

JPAロック(楽観的および悲観的)の原則を理解しましたが、エンティティの管理者、クエリなどに適用するすべてのロックは常にサーバー側にあります。すべてのEJBはサーバー上に配置されているため、それらによって使用されるトランザクションもサーバー上でロックされます。WebコンポーネントでJPAロックを使用する

あなたのeコマースウェブサイトのコード担当者は、自分のデータを変更したいとします。ユーザは、クライアント(例えば、フェイスレット)の変更を記入し、サーバに送信して提出し、サーバがロックを取得する。しかし、管理者が初期読み込みとロック取得前の間にcostumersデータを変更した場合はどうなりますか?これにより、読み込みがダーティーになる

ロック機構をどのようにWeb層に拡張できますか?
私はWeb上でオプションを見つけることはできませんでしたが、JPAの現在のロックAPIはそれほど役に立たないでしょうか?

答えて

0

エンティティをブロックすることなく、不正な読み込みを避けるために、エンティティクラスに@Version属性を追加する「バージョンロック」というJPAの機能を使用できます。シンプル

例:誰かがあなたの前にデータを更新し、データを更新しようとした場合

@Entity 
public class Persona implements Serializable { 
    //... other properties 

    @Version 
    @Column(name="VERSION") 
    private long version; 

// getters and setters 
} 

は今、JPAエンジンは他の誰かとの情報を更新することを示す例外をスローします。このオプションは、アプリケーション全体のパフォーマンスが低下する可能性のあるブロックを防止します。

+0

ありがとうございますが、私は楽観的なロックの概念に精通しています。 JPAが各トランザクションの最後に変更をチェックするということです。さて、これは、ダーティリードに対する保護を提供しますが、トランザクションの時間だけです。他の誰も同じビットのデータを同時に変更しないようにトランザクションがないので、クライアントがブラウザのデータを変更している場合、このセキュリティは存在しません。 – Wecherowski

関連する問題