• システム開発に関わる内容をざっくりと書いていく

楽観ロック

楽観ロックとは

楽観ロックは、データの競合が少ない場合に有効な同時実行制御手法で、データの読み取りを自由に行わせつつ、データの更新時にのみ競合が発生したかどうかを確認して制御する方法。基本的な考え方は、データの読み込み時にはロックをかけず、更新時にデータが他のプロセスやユーザーによって変更されていないかをチェックすることにある。

楽観ロックの仕組み

  1. データの読み取り
    • 楽観ロックでは、データベースからの読み取り時にロックをかけない。これにより、複数のプロセスやユーザーが同じデータを自由に読み込むことができ、パフォーマンスの向上が期待できる。
  2. 更新時の競合確認
    • 更新を行う際に、事前に読み込んだ**バージョン情報(versionUpdateTime)**と、データベースに現在保存されているバージョン情報を比較する。もしバージョン情報が異なる場合、他のプロセスがそのデータを更新していることを意味する。

楽観ロックのメリット

  1. 高いパフォーマンス
    • データの読み取り時にロックをかけないため、データベースのパフォーマンスに与える影響が少ない。特に、データの読み取りが多く、データの更新が少ない環境では非常に有効。
  2. デッドロックが発生しない
    • トランザクションの開始時にロックをかけないため、複数のトランザクションが互いにロックを待機し続けるデッドロックの発生を防ぐことができる。
  3. スケーラビリティ
    • 複数のユーザーが同じデータにアクセスしても、読み取り時には制約がないため、スケーラブルなシステムを構築することができる。

楽観ロックの適用例

たとえば、ECサイトの在庫管理システムでは、複数の顧客が同時に商品を閲覧し、カートに追加することができるが、実際に購入の手続きを行う段階で競合が発生する可能性がある。このようなケースでは、楽観ロックが有効。

  1. 在庫情報の取得
    複数のユーザーが同じ商品情報を読み取り、在庫数を確認する。しかし、この時点ではデータにロックはかからない。
  2. 購入処理時の確認
    購入時に在庫が減少するので、更新前に他のユーザーが在庫を変更していないかを確認。変更されていた場合は、エラーメッセージを表示し、再度在庫確認を促す。

注意点と対策

エラーハンドリング
更新時にバージョンが一致しなかった場合の処理を適切に行う必要がある。一般的には、ユーザーに「データが変更されています。再度確認してください」といったメッセージを表示し、ユーザーが最新のデータを再取得するよう促す。

競合が頻発する場合には不向き
楽観ロックは、データの競合が少ない場合に効果的だが、競合が頻発する環境では適用が難しい。頻繁にバージョン情報が異なってしまい、更新が成功しないケースが増えるため、その場合は悲観ロックなどの別のロック手法を検討する必要がある。

適切なバージョン管理
バージョン管理やUpdateTimeのフィールドが正しく運用されていないと、楽観ロックは正常に機能しない。必ず更新ごとにversionUpdateTimeが自動的に変更される仕組みを整える必要がある。