データベース

楽観ロック(楽観的排他制御)とは

2019年7月5日

排他制御とは

排他制御とは、共有資源に対して同時にアクセスしても問題なく動作できる制御のことです。

例えば下記のように「在庫が10個ある商品」を、2人が同時に購入するとします。

排他制御説明1

排他制御説明2

まずは購入可能であるか確認するために、「在庫テーブル」から残りの在庫数を取得します。

残りの在庫数は「10個」なので購入可能であることが分かります。

排他制御説明3

購入可能な状態なので購入を行います。お互い「在庫テーブル」の在庫を1つ減らします。

お互いが同時に操作した結果、在庫数が「9個」になってしまいました。このように共有資源に対して排他制御をおこなわないとデータがおかしくなってしまう危険性があるのです。

スポンサーリンク

排他制御には様々な方法がありますが、有名な方式として楽観ロック(楽観的排他制御)と悲観ロック(悲観的排他制御)が存在します。

本記事では「楽観的な前提の排他制御」である、楽観ロックについて紹介します。

楽観ロックって何?

楽観ロック(楽観的排他制御)とは、そもそも「同時アクセスはあまり起きない」という楽観的な考え方の排他制御です。データ自体をロックすることはせず、更新対象のデータが更新前と同じであるかを確認してから更新することで、データの整合性を保つことができます。

例えば、以下のように会員サイトの顧客情報を同時に閲覧しているとします。

ここでポイントなのは「顧客テーブル」にバージョンが付与されている点です。

楽観ロック説明1

同じデータを閲覧している2人が同時にデータを更新した時、楽観ロックをしていると以下のような挙動となります。

楽観ロック説明2

まず先にテーブルにアクセスした方の変更内容のデータがテーブルに反映されます。この時、「顧客テーブル」のバージョンがカウントアップされ「2」に更新されます。

楽観ロック説明3

次にテーブルへのアクセスがやや遅れた方も、変更内容のデータをテーブルに反映します。

しかしデータ取得時と更新時の「顧客テーブル」のバージョンが異なる(カウントが「2」になっている)為、楽観ロックエラーになり、更新されません。

スポンサーリンク

このように楽観ロックを行うことで、データの整合性を保つことができます。

楽観ロックはデータ自体をロックしないので、処理が順番待ちになることはありません。ただし同時操作が行われた場合は、後負けとなります。

そのため楽観ロックは、楽観ロックエラーになっても問題が発生しないようなケースの時に使用します。

例えば上記の「会員サイト」の場合は、楽観ロックエラーになった時は「すでに変更されたデータの可能性があります。最新の状態で再度実行してください」などのエラーメッセージを表示する事で、ユーザーに再度実行してもらうことが可能です。

helpful