楽観ロックとは
そもそも楽観ロックとは、めったなことでは他者との同時更新は起きないであろう、という楽観的な前提の排他制御のことです。データそのものに対してロックは行わずに、更新対象のデータがデータ取得時と同じ状態であることを確認してから更新することで、データの整合性を保証します。
例えば、顧客がレジで顧客が購入したら、商品テーブルから在庫数カラムの情報を購入した分を反映するAPIが処理されるとします。
在庫10のりんごがある状態から、Aさんがりんごを10個購入すると、商品(りんご)テーブルの在庫数カラムは0になります。
これだと正常にDBに0と表示されますが、Aさんの他に同時にBさんがりんごを10個購入するとどうでしょう。
Aさんがりんご購入時の在庫数カラムは10なのに、Bさんが購入時にも在庫数カラムは10となっているので、AさんBさんどちらもりんごを購入することができてしまいます。
一つのSQLを並行して同時に処理することができてしまうと、データの整合性が取れず予期せぬ挙動を許容してしまいます。
このような事態を防ぐため、楽観ロックを実装します。
具体的な楽観ロックの実装方法
具体的な処理として挙げられるのは、更新対象のデータがデータ取得時と同じ状態であることを判断することです。
上記の例だと、「商品(りんご)テーブルの在庫数カラムが10であることを確認した時刻」と「商品(りんご)テーブルの在庫数カラムが更新された時刻」を比較します。
両方の時刻が等しくない時(=)でない時、エラーを吐くという処理を実装してあげれば良いです。
このように処理すると、AさんBさんが商品(りんご)テーブルの在庫数カラムを同時に取得してしまった時、どちらかのりんご購入時に処理されるAPIはエラーを表示されることになり、片方のAPIしか実行されずにすみます。