ぽせい丼さんのブログ[ADO.netは便利なのか? ]


私の意見

ぽせい丼さんのブログ[ADO.netは便利なのか? その2 ]


これまでの流れを知らない方は上記リンクを見てみてください。


さて、ぽせい丼さんの疑問、もっともなことだと思います。


>今のところ、ADO.netを用いた場合、排他制御はどう考えればいいのか、よく分からないで居るからだ。例えば、更新系でも「早い者勝ち」「最終更新が有効」「利用中は他の人は閲覧のみで更新不可」など、選択したい場合もある。


この問題について、私が分かる範囲で答えたいと思います。


ADO.NETはオプティミズム(楽観的)な更新が元にあります。


つまり誰かが更新してるかも知れないということを前提にしているとと理解しています。


では、誰かが更新していたレコードを更新する場合どうなるのか。


基本的には、クライアントで取得されている各カラムの全てのデータが一致しているものに対して更新するように指定できるようになっています。


この辺は注意が必要で、基本的にADO.NETでは更新用のSQLをユーザが自由に制御できますので他のやり方も出来ます。


つまり排他制御などを使用していないという事です。


ぽせい丼さんの疑問の「早い者勝ち」というのはこのパターンに当たると思います。


では、「最終更新が有効」にするにはどうすればよいのか。


この場合は、主キーでの更新処理をすればよいという事です。


他のカラムが先に他の誰かに更新されていても、主キーで一致するレコードに対して更新処理をすれば後の更新が有効となります。


自分がみている間はそのテーブルは他の人は参照のみというのは、残念ながら今の自分にはわからないのでそこは許して下さい。


というか、知っている方教えてください(/ω\)


しかし、このあたりの話はすごく重要です。


デフォルトでは、更新処理に失敗すると例外が発生します。


例えばDataGridViewにおいて表示されいてる複数のレコードを変更し、その後DBに更新処理をさせた時、すでに何れかのレコードが先に更新されていたとしたら、いくつエラーで、どのレコードがダメなのかというのが分からないと、ユーザには反感を買うでしょう。


実はこのあたりの事も私の愛読書「ADO.NET 2.0」に詳しく載っています。


また、色々なケースでの更新処理の話や、トランザクションの話なども載っています。


ページ数も多く、値段もかなりのものであるが、お勧めです。


ADO.NETを使う方は是非読んでみてください。


プログラミングMicrosoft ADO.NET2.0 (マイクロソフト公式解説書 Microsoft Visual Studi) (Amazon)