Java EE Webアプリケーションは、iBatis(ORM)を使用してデータベース操作を実行します。データベースの運用フローは以下のとおりです。
フロー:JSP ---> Action ---> ServiceIMpl ---> DaoImpl---->IBatisを介した更新クエリの呼び出し
注:アクション、サービス、およびDAOクラスは、Spring2.5の依存性注入手法を使用してインスタンス化されます。Struts2を使用しています。
問題:2人の同時ユーザーが同じレコードを検索し、User1がAttribute1を更新し、User2がAttribute2を更新します。User1は最初に[保存]をクリックし、次にUser2は[保存]をクリックします(数秒の差で互いにフォローします)。データベースにデータが表示されている場合、User1の更新のみが存在します。[監査]列には、User1の更新のみが表示されます。Attribute2でのUser2の更新は行われず、同時に、例外はスローされません。
sqlmapxmlで定義された更新クエリの呼び出しを取り巻くiBatisでbeginトランザクションとcommitトランザクションを使用してみました。同じ問題が解決しません。これらのトランザクションコマンドも削除しようとしましたが、問題は解決しません。
更新中の同時実行を処理するために、特別な/異なることを行う必要がありますか?iBatisのようなORMは自分で処理しませんか?
追加情報:さらに調査したところ、次の情報が明らかになりました。
User1とUser2がレコードをクリックすると、その完全なデータがフェッチされて表示されます。
これで、User1とUser2の両方がいくつかの属性を変更し、[保存]をクリックすると(同時に)、最初にUser1のデータが更新され、次にUser2のデータが更新されている間に、User1の既に更新されたデータが上書きされて失われます。
What approach is usually followed in such screens to handle such scenarios ?