8

JPA concurrency に関するこの記事を読みましたが、厚すぎるか、十分に明示的ではありません。

データベース制御のアトミック update-if-found-else-insert 操作 (an UPSERT) を実行しようとしています。

私の貧弱な頭脳には、もちろんトランザクション内で、 のロックモードで名前付きクエリを実行し、結果PESSIMISTIC_WRITEが返されるかどうかを確認してから、persist()またはその後のいずれかを実行できるように見えますupdate()

私がはっきりしていないのは、この操作をPESSIMISTIC_WRITEロックとロックで行うことの違いPESSIMISTIC_READです。私は文を読みました--それPESSIMISTIC_READは反復不可能な読み取りを防ぐことを意図していることを理解しています、そしてPESSIMISTIC_WRITE...まあ、多分私はそれをあまりよく理解していません:-) --しかし、その下には単なる SQLSELECT FOR UPDATEです、ええ? 両方の場合において?

4

3 に答える 3

4

データベース制御のアトミック update-if-found-else-insert 操作 (UPSERT) を実行しようとしています。

質問全体に正確に答えているわけではないかもしれませんが、競合状態なしで上記を実装したい場合は、IMOテーブルレベルのLOCK IN EXCLUSIVE MODE (行だけでなく) が必要です。これがJPAでできるかどうかはわかりません。たぶん、あなたにとって何が受け入れられるかを明確にすることができます。

于 2010-09-30T20:17:55.440 に答える
3

私はこの種の状況に直面し、これを見つけました:

悲観的ロック、つまり、トランザクションの開始時にオブジェクトをロックし、トランザクション中にロックを維持することは、次の 2 つの PessimisticLockModes によって行われます。 > エンティティは他のトランザクションで読み書きできません

記事へのリンク

于 2013-02-20T22:52:15.560 に答える