楽観的同時実行制御 。つまり、Userテーブルには、行が更新されるたびにHibernateがインクリメントするバージョンフィールドがあります。
ほとんどの場合、トランザクションはHTTPリクエストの開始時に開始し、HTTPレスポンスの終了時に終了します。つまり、ユーザーを編集するプロセスは2つのトランザクションで構成されます。1つはWebフォームに入力するトランザクションで、もう1つは変更を保存するトランザクションです。
その場合、データベースの分離レベルを変更しても効果はありません。ほとんどの場合、取得できるのはパフォーマンスとスケーラビリティの低下 。
StaleObjectException
があることは悪いことではありません s。それは現実の世界を反映しています-人々は実際に時々同じことをし、対立が起こるかもしれません。問題は、競合が検出された場合、エンドユーザーが満足できる方法でどのように解決するかということです。ユーザーの助けがなくても解決できますか?
考えられる戦略は
-
前のユーザーの変更を上書きします(多くの場合、必要なものではないため、同時実行制御が必要です)、
-
ユーザーに更新して変更を再度実行するように求めるエラーメッセージを表示します。
-
前のユーザーの変更を上書きせずに、変更を自動的にマージします(場合によっては可能)
-
データの古さをユーザーに通知し、変更を手動でマージする方法をユーザーに提供します
それはすべて文脈に依存します。