• ベストアンサー

DBへの重複更新を防ぐ方法について

いつも、お世話になっております。 現在、ASP.NetとOracle9iでWebアプリケーションを開発しています。 現在、複数のユーザがほぼ同時に同一のデータに更新をかけられないよう にする処理で悩んでいます。 今まで開発してきたシステムでは、各データに更新回数を持たして、 その数をチェックすることにより、同時に更新されることを防いできました。 具体的には、 ユーザA:データ取得(このときの更新回数X) ユーザB:データ取得(このときの更新回数X) (ユーザA,B共に画面などで、データ操作) ユーザA:トランザクション開始 このとき、取得した更新回数を再度取得、X ユーザAが先に取得したときと更新回数が同一のため、データは更新されていない。 データ更新処理を許可する データ更新を行い、更新回数を+1する コミット ユーザB:トランザクション開始 このとき、取得した更新回数を再度取得、X+1 ユーザBが先に取得したときと更新回数が同一でないため、データは更新されている データの更新は許可しない ロールバック という処理を行っています。 しかし、この方法では、ユーザAがデータ更新を行う直前でかつ、ユーザBが更新回数のチェックを行うというタイミングだと、ユーザBがデータの更新ができてしまうようです。 より安全に重複更新を避けたいのですが、良い手はございませんか?ご存知でしたら、教えていただけないでしょうか?宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • enzo_taku
  • ベストアンサー率47% (9/19)
回答No.1

排他制御はそれぞれの業務により向き不向きがあるため、一概にこうした方がよい...とは言えないですが。。。 http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp11/entwebapp11_01.html # 自分であれば更新日時を保持し SELECT FOR UPDATE 使うかな

kiyohu16
質問者

お礼

会社からログインできないので、返信が遅くなってしまいまいました。 @ITのページを参考にさせて頂きました。 ありがとうございました。

その他の回答 (1)

回答No.2

更新日時が記録されてるならそれを利用するとか。 あとは、ADO.NET の DataAdapter コントロールに自動的に UpdateCommand を作らせると、全ての列を比較して更新する SQL 文と作ります。(相手が SQL Server の場合しか経験ないですけど)

kiyohu16
質問者

お礼

返信が遅くなってしまいました。 打合せの参考にさせて頂きました。 ありがとうございました。