では、実行してみよう。
ここまで、まったくコードを書いていないが、DB更新処理が行えるようになったのである。
簡単にDB更新処理が行えるようにはなったが、このままで問題ないのであろうか?
実際にDB更新処理で不具合が起きやすい例として、複数端末(=数多くのクライアントPC)からの同時更新がある。以下でその動作を確認してみよう。
複数端末といってもマシンを複数用意する必要はない。以下の画面のように、ブラウザを複数開けば、疑似的に複数端末からの同時更新の動作を確認できる。
上の画面の実行結果は次のようになる。
なぜこのようなことが起こるのだろうか?これにはASP.NETにおけるDBアクセスの仕組みを理解する必要がある。
今回はVisual Web Developerを利用しており、すべての機能を同じマシン上で動作させているが、これを分けて考えてみよう(実運用環境ではこのような構成をとることが多い)。
まず編集ページを表示するときには、WebサーバはDBサーバからSelect文でデータを取得し、ブラウザが解釈できる形に変換して、ブラウザに渡す。このときにブラウザに渡される情報は見た目を定義したHTMLと実際のデータである。
次に項目の内容を変更し[更新]リンク・ボタンをクリックしたときには、ブラウザはWebサーバに対し編集後のデータを渡す。Webサーバはここで受け取ったデータのみを基にUpdate文を生成しデータを更新するのである。
ここではそれぞれの画面で異なるフィールドを変更したが、同一のフィールドを更新した場合にも上書きされ、先に更新した画面の内容が消えてしまうことになるのである。
このように、ほかの端末などで更新されたことを確認しないでDB更新を行う仕組みになっているため、古い値で上書きされる問題が起こるのである。
VB6アプリでの更新時にはDB更新時にはロックをかけたと思う。しかし、ASP.NETをはじめとするWebアプリでは、このロックをかけることはできない*1。詳しくは第1回で解説しているが、ブラウザでデータが表示されている間、Webサーバはそのことをまったく知らないからである。
*1 実際にはロックを実現する処理を自分で作れば可能であるが、ブラウザが間違えて閉じられた場合などに、このロックを解除することができなくなるため、使われていないロックを解除する処理なども必要となり、煩雑であるため推奨しない。
Copyright© Digital Advantage Corp. All Rights Reserved.