実行結果
それでは実際に同時実行して結果を確認してみましょう。ブラウザで2つのウインドウ(またはタブ)で同一データの予約変更画面を開き、両方で更新を行ってみてください。
うまくいけば、後から更新した方の画面は、次のようなメッセージが表示されるはずです。
まとめ
- 排他制御とは複数ユーザーが同時に更新できないようにすること。
-
排他制御は大きく2つに分けることができる。
- 悲観的排他制御:トランザクションの開始から終了までデータをロックし、他のユーザーに触らせない。
- 楽観的排他制御:更新前と更新時の対象データの状態を判定し、変更されていたら更新しない。
- Webアプリケーションはステートレスのため、楽観的排他制御が主に用いられる。
-
楽観的排他制御の実現方法として「時刻印アルゴリズム」が有名。
- 「時刻印(タイムスタンプ)」をデータに持たせ、更新前後でタイムスタンプを比較することにより、変更されたかどうかを判定する。
-
EFで時刻印アルゴリズムを使用するには、POCO EntityでTimestamp属性を付けたプロパティを使う。
- データベース上ではrowversion型の列として定義される。
- EFが自動的にTimestamp属性のついた項目を使って楽観的排他制御を行う。
- 排他エラーの発生は、DbUpdateConcurrencyExceptionで検出する。
さて、次回はASP.NET Webフォーム業務アプリケーションにAjaxを導入する方法について解説する予定です。次回もお楽しみに。