コンピュータープログラミングの分野における楽観的ロックと悲観的ロックとは何ですか

オプティミスティック ロックとペシミスティック ロックは、データへの同時アクセスに対処するためにコンピューター プログラミングの分野で使用される 2 つの異なる戦略です。その主な目標は、データの一貫性と整合性を確保し、複数のスレッドまたはプロセスが共有データに同時にアクセスする場合の競合状態を回避することです。さまざまなシナリオで、適切なロック戦略を選択すると、プログラムのパフォーマンスと信頼性が向上します。

1. 悲観的ロック:

悲観的ロックでは、データの操作時に競合状態が発生すると想定しているため、他のスレッドやプロセスが同時にデータを変更できないように、デフォルトでデータがロックされます。この戦略では、同時実行性の競合は正常であると考えているため、データ アクセス中にロックを追加して、一度に 1 つのスレッドのみがデータにアクセスできるようにして、同時実行性の問題を回避します。

:
複数のユーザーが同時にアクセスしてお金を引き出すことができる銀行口座があるとします。悲観的ロックを使用すると、ユーザーが出金を開始すると、システムはユーザーが出金操作を完了するまでアカウント データをロックします。他のユーザーはロックが解除されるまで待ってから続行する必要があります。

データベースでは、SELECT ... FOR UPDATEステートメントを使用して悲観的ロックを実装できます。トランザクションがステートメントを実行すると、トランザクションが完了するまで選択された行がロックされます。

2. 楽観的ロック:

オプティミスティック ロックの考え方は、ほとんどの場合、データの同時実行性の競合がほとんど発生しないため、ロックを過剰に取得する代わりに、データを更新する前にチェックを実行して、データが他のスレッドによって変更されているかどうかを確認するというものです。変更されていない場合は、更新操作を実行します。変更されていない場合は、再試行するか、競合処理を実行します。

:
複数のユーザーが同じ商品を同時に購入できるオンライン ショッピング サイトを考えてみましょう。オプティミスティック ロックを使用すると、各製品レコードにバージョン番号が付けられます。ユーザーが製品を購入したい場合、システムは製品のバージョン番号を読み取り、ユーザーが注文を送信すると、システムは再度バージョン番号をチェックし、バージョン番号が一致していれば、購入操作が行われます。実行されると、バージョン番号が増分されます。バージョン番号が一致しない場合は、ユーザーが製品を閲覧してから購入するまでに他のユーザーがデータを変更したことを意味し、システムはユーザーに購入操作を再確認するよう求めます。

データベースでは、バージョン番号フィールドを追加することでオプティミスティック ロックを実現できます。データを更新するときは、現在のバージョン番号が予想されるバージョン番号と一致するかどうかを確認し、一致する場合は更新を実行します。そうでない場合は、データが変更されたことを示します。

適切なロック戦略を選択します。

悲観的ロックと楽観的ロックの選択は、特定のアプリケーション シナリオと同時アクセス モードによって異なります。

  • 悲観的ロックは、同時実行の競合が非常に頻繁に発生し、データ変更操作が複雑で、競争が激しい状況に適しています。ただし、悲観的なロックはロックの待機を頻繁にブロックするため、システムのパフォーマンスの低下につながる可能性があります。

  • オプティミスティック ロックは、同時実行の競合が比較的少なく、ほとんどの場合データが安全で、競合状態が発生するのはまれな場合にのみである場合に適しています。楽観的ロックではロックのオーバーヘッドがあまり発生しませんが、競合処理ではより多くのロジックを考慮する必要があります。

実際のアプリケーションでは、ビジネス ニーズとパフォーマンス要件に基づいて適切なロック戦略を選択でき、同じシステム内で悲観的ロックと楽観的ロックを使用して、異なるデータに対して異なる処理を実行することもできます。

要約:

オプティミスティック ロックとペシミスティック ロックは、データへの同時アクセスに対処するための 2 つの主な戦略です。悲観的ロックでは、同時実行の競合が正常であることを前提とし、競合状態を回避するためにデータ アクセス中にロックが追加されます。オプティミスティック ロックは、同時実行の競合が少ないことを前提としており、最初に動作し、更新する前にデータが変更されているかどうかを確認します。実際のアプリケーションでは、同時アクセス モードとパフォーマンス要件に従って、適切なロック戦略を選択することが、データの一貫性とプログラムの信頼性を確保する鍵となります。

おすすめ

転載: blog.csdn.net/i042416/article/details/132254894