|
2009/08/03(Mon) 22:21:51 編集(投稿者)
■No39244 (たっぽ さん) に返信 > Aさん・Bさんがそれぞれ違う端末で同じデータを取得し、データ更新入力を行ったとします。 > Bさんの方が先に更新をかけ、その後Aさんが更新します。 > 当然、楽観的ロックを使用しているのでBさんの更新は問題無く終了し、Aさんはデータ取得時と現在のDBデータが異なる為、更新できません。
『同時更新が発生した場合、そのアプリはどのように動いて欲しいのか』に関わることなので、 ケースバイケースだと思います。
たとえば、在庫をリアルタイムに処理するオンラインショップなどでは、 後から更新されるデータに対しては、『その商品は既に完売してしまいました。』と表示して、 先に登録された方を優先するべきかも知れません。
あるいは、単に『後書き優先』の実装で構わないケースもあるでしょう。 その場合にはたとえば、UpdateCommand に設定される SQL を UPDATE 従業員 Set 氏名 = @氏名, 住所 = @住所 WHERE 従業員コード = @original_従業員コード のようにする、という手法があります。
この場合、元のレコードが削除されていた場合は更新されませんが、 同時更新については、他のデータ(氏名や住所)が書き換えられたとしても、 主キー(従業員コード)が変更されていない限りは、そのまま更新されます。
> 私が考えたのは > 「破棄してしまい、現在のデータベースの情報を取得・確認してもらって再修正」 > でした。 > しかし、「破棄・再修正は二度手間になるのでしたくない」と言った意見が出てきて困っている次第です。
競合した場合、本当に上書きして良いのかを再確認させるために、 最新の該当レコードを、確認用の別画面に ReadOnly 表示するというパターンもあります。
|