701999_50606681

 プログラムの処理方法で一つのデータを複数人で更新したときのトラブル防止として、「悲観的排他制御」と「楽観的排他制御」があります。下記にその解説用の図を書いてみます。

複数人による同時更新トラブル

 データベースのあるデータを複数人で更新することがあります。その更新を同時に行った場合どのようなことが起こるでしょう。

 例えばユーザーAがデータベース(DB)内のIDが12のデータを更新しようとします。既存のデータを取得し、ある項目を「犬」と入力しました。この時点ではDBのデータは変わっていません。

 ユーザーAがデータを取得した後にユーザーBが同じIDが12のデータを取得し、同じ項目を「猫」と入力しまし、ユーザーAよりも早くDBを更新しました。DBのID:12のデータは「猫」が入っています。

 ユーザーBがDBのデータを更新した後、ユーザーAがデータを更新するとDBのID:12のデータは「犬」に変わります。

複数ユーザーによる同時更新のトラブル

複数ユーザーによる同時更新のトラブル

 この時、ユーザーAは自分の思い通りの処理ができていますが、ユーザーBはタイミングによっては自分が「猫」と更新したのにもかかわらずDBには「犬」が入っていて疑問に感じることでしょう。

 データを複数人で更新すると「早い者勝ち」という考え方から上記の処理は十分あり得ることだし、間違ったことではありません。ただ、ユーザーBが何も気がつかないというのはいかがなものかと思います。せめて「更新できなかった」「更新できた」などの正しい情報は得るべきかと思います。この正しい「結果」が得られなかったことが複数人による同時更新のトラブルです。

悲観的排他制御

 では、このトラブルをどのように対処しましょう。一般的には2つの方法があります。まずは「悲観的排他制御」です。「悲観的ロック」とも言うようです。

 悲観的排他制御は最初にDBを取得した人がデータを更新するまで他人にデータを更新させない処理です。

悲観的排他制御

悲観的排他制御

 この制御方法は利用する環境にもよりますが、Webで利用するとロックしたユーザー(上記図の場合はユーザーA)がデータをロックした後に何かしらの理由でページを閉じるようなことがあると、ロックがかかったままになるなどのトラブルが考えられると思います。制御側でデータ取得&変更&セットを一連で行うような場合は問題ないと思いますが。

楽観的排他制御

 もう一つの方法というのは「楽観的排他制御」です。別の呼び方としては楽観的ロックです。

 この楽観的排他制御はデータを取得するときに自分のフラグをセットし、更新時に自分のフラグが残っていた場合は更新ができるという処理です。

楽観的排他制御

楽観的排他制御

 この処理の場合、ロックしている時間がないのがメリットかと思います。

最後に

 どちらの制御方法を選ぶかはその利用する内容や環境により一概にどちらがいいとは言えません。また、制御の方法もどのように行うかは環境や状況によっても異なります。その環境にあった使い方をすればいいのではないでしょうか。ただ、このような方法があることを知っておくだけでも違うかと思います。

【参考サイト】
データの同時更新を防ぐための排他制御 (1/3):CodeZine
Webアプリケーションの排他制御|保険システム開発ならプロフェッサ(東京都/品川区)