SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

データの同時更新を防ぐための排他制御

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本連載ではツールやフレームワークの機能を最大限利用しつつ、保守、開発効率を意識したWebフォームアプリケーションを開発する方法を学んでいきます。前回から2回に渡って、データの整合性をどのように確保していくかということを学んでいます。今回は排他制御についてです。

  • X ポスト
  • このエントリーをはてなブックマークに追加

同時更新の問題

 テキストエディターなどの基本的に1人で使う「スタンドアローン」なアプリケーションとは異なり、業務アプリケーションは大勢が同時に使うことが前提です。

 大勢が同時に使う場合、1人で使う場合とは大きく異なる点が1つあります。それは、「同じデータをほぼ同時に編集する」というケースが発生するということです。

 同じデータをほぼ同時に編集した場合、何も対策をとっていなければ、わずかな差で後から編集を行った操作が採用されることとなります。しかし、それでは具合が悪い場合もあります。

 本連載で作成している会議室予約システムで考えてみましょう。

 すでに登録されている予約情報の時間を2人がほぼ同時に更新したとします。このとき、先に変更を行ったユーザーは、他のユーザーがほぼ同時に同じ予約を変更したとは思っていません。もちろんエラーも発生しないため、自分の行った変更が正しく反映されたと思うでしょう。

 しかし実際は、後から変更したユーザーの入力内容で予約情報が上書きされてしまっています。

図1 同時更新のイメージ
図1 同時更新のイメージ

 もちろん、変更を行った後、予約参照画面で確認することはできますが、自分が行った変更が無事に行われたかどうかを毎回確認することは、あまり現実的ではありません。

 そこで、こういった同時更新を防ぐために行うのが排他制御です。

排他制御

 排他制御とは、一言でいえば同じデータを複数人が同時に変更できないようにする仕組みです。変更できないようにすることを俗に「ロックする」と呼びます。

 排他制御には、大きく次の2つの方法があります。

  1. 悲観的(Pessimistic, ペシミスティック)排他制御
  2. 楽観的(Optimistic, オプティミスティック)排他制御

 それぞれについて説明していきましょう。

悲観的排他制御

 悲観的排他制御では、更新対象のデータを読み出してから更新を終えるまでの間、他のユーザーがそのデータに触れないようロックします。

図2 悲観的排他制御のイメージ
図2 悲観的排他制御のイメージ

 この方法の特徴として、

  1. ロックを取得したユーザーのみ更新が行える。
  2. トランザクションが長くなるとロック期間が長くなり、全体としてのパフォーマンスが落ちる。

といった点があります。

 従って、トランザクションが短く、頻繁に更新され、なおかつ同時更新が多発するような場合、例えば金額の管理に向いています。

楽観的排他制御

 楽観的排他制御では、更新対象データを最初に取得した時点ではデータをロックしません。

 そのかわり、データを更新する直前に、他のユーザーによって更新されていないかどうかをチェックします。この時初めて対象データをロックします。

 そして、他のユーザーによってすでに更新されていた場合、更新処理をキャンセルします。ユーザーにはキャンセルしたことを伝え、もう一度処理をやり直してもらうよう促します。

図3 楽観的排他制御のイメージ
図3 楽観的排他制御のイメージ

 この方法の特徴としては、

  1. 複数のユーザーが並行して更新処理を行える。
  2. 反面、データの衝突(コンフリクト)が発生しやすい。

といった点があります。

 従って、更新頻度がそれほど高くなく、同時に編集するユーザーが少ないような場合、例えばマスターメンテナンスなどでよく用いられます。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
どちらの排他制御を選ぶか

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6764 2012/09/25 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング