私は顧客に関する情報を含む顧客と呼ばれる休止状態のエンティティを持っています.私の方法では、データベースに挿入する必要があるパラメータとして顧客の詳細を取得しています. したがって、重複したエントリを削除するには、その顧客が既にデータベースに存在するかどうかを確認しています。しかし問題は、同じ顧客情報を使用して同じメソッドに対して 2 つの呼び出しが一度に行われると、制約違反エラーが発生することです。saveOrupdate() で問題が解決すると思いましたが、解決していません。誰かがこのシナリオの解決策を提案できますか?
2 に答える
saveOrUpdateは、まったく異なる目的のためのものです。これは、すでに永続化されている可能性のある(IDとすべてを持つ)エンティティを永続化するためのものであるか、新しいIDである可能性があります。同時アクセスとは何の関係もありません。
あなたの問題には、楽観的ロックと悲観的ロックとして知られる2つのオプションがあります。
ペシミスティックロック:顧客が存在するかどうかを確認する前にロックを作成するため、現在のスレッドのみが続行でき、確認が行われ、それに応じて動作します。同じデータを持つ他のスレッドは、最初のスレッドの更新または挿入が完了するまで待機する必要があります。ロックは、休止状態を使用して、または単一のマシンで実行している場合は単に同期されたブロックを使用して、データベースに実装できます。
楽観的ロック:今と同じように先に進みます。ただし、質問で説明した衝突のケースを処理するための例外ハンドラーを配置します。
ペシミスティックロックは、同期ブロックを使用して実装する方がおそらく簡単ですが、パフォーマンスとスケーラビリティにかなり悪影響を及ぼします。
saveOrUpdate
オブジェクトの主キー属性値で機能します。たとえば0
、新しいオブジェクトのデフォルトであり、新しいcustomer
オブジェクトに主キー属性が設定されて0
いる場合、常に保存(挿入)を試み、更新を試みません。主キー属性がゼロ以外の値の場合にのみ更新を試みます。saveOrUpdate
これがあなたの問題を解決していない理由です。
unique
回避策として制約例外を処理する以外に何ができるかわかりません。