オプティミスティック ロックを実装するには、2 つの一般的な方法があります: 1. バージョン番号メカニズム、2. CAS アルゴリズム。その中でも、バージョン番号メカニズムによる楽観的ロックの実装は、最も古典的な方法です。バージョン番号メカニズムは通常、データベースのバージョン番号 version フィールドをデータ テーブルに追加します。
実装方法:
(推奨学習: mysql チュートリアル)
1 , バージョン番号のメカニズム
一般的には、データが変更された回数を表すために、データベースのバージョン番号 version フィールドをデータ テーブルに追加することを意味します。データが変更されると、そのバージョン値が増加します。 1までに。
例:
もちろん、スレッド A がデータ値を更新する必要がある場合、データの読み取り中にバージョン値も読み取ります。更新を送信するときに、バージョン値が読み取られただけの場合は、現在のデータベースのバージョン値が等しい場合にのみ更新します。そうでない場合は、更新が成功するまで更新操作を再試行します。
2. CAS アルゴリズム
CAS (compare and swap) 比較と交換には、メモリ アドレス V、期待値 B、置換対象の 3 つのオペランドがあります。サブA。
CAS 命令を実行すると、メモリアドレス V と期待値 B が等しいかどうかを比較し、等しい場合は A を B に代入します。等しくなるまで繰り返されます。) 比較代入操作全体はアトミック操作です。
CAS の欠点:
(1) サイクル時間のオーバーヘッドが大きい: メモリ アドレス V が期待値 B と等しくない場合、それらが等しくなるまでループ内で比較され続けます。 ;
(2) 共有変数のアトミック操作のみが保証されます;
(3) 変数 V が最初に読み取られたとき、および代入の準備時に値 A であった場合値がまだ値 A であることが確認されたら、その値が他のスレッドによって変更されていないことを意味しますか?明らかにそうではありません。この期間中に値が他の値に変更され、その後 A に戻される可能性があるからです。その場合、CAS 操作はその値が変更されていないとみなします。この問題は CAS 操作の "ABA" と呼ばれます。」質問;###
以上が楽観的ロックを実装するには、いくつかの一般的な方法があります。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。