mysqlで楽観的ロックを実装する方法

WBOY
リリース: 2022-02-24 10:59:40
オリジナル
9151 人が閲覧しました

mysql では、データ バージョンのバージョン記録メカニズムを使用して、オプティミスティック ロックを実装できます。データ テーブルにバージョン フィールドを追加します。記録されたバージョン番号は、操作ごとに 1 ずつ増加して、バージョン値が正しいかどうかを判断します。クエリされた値と等しい。等しい場合は更新が実行され、等しくない場合は更新は実行されません。

mysqlで楽観的ロックを実装する方法

このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。

mysql でオプティミスティック ロックを実装する方法

実装方法

1. データ バージョンのバージョン記録メカニズムを使用して実装します。これはオプティミスティック ロックの最も一般的に使用される実装方法です。ロック中。

2. データ バージョン、つまりデータにバージョン識別子を追加します。これは通常、数値バージョン フィールドをデータベース テーブルに追加することによって実現されます。データを読み込む際にはバージョンフィールドの値も一緒に読み込まれ、データが更新されるたびにバージョン値が1ずつ増加します。更新を送信すると、データベース テーブル内の対応するレコードの現在のバージョン情報と、初めて取得したバージョン値が比較されます。データベース テーブルの現在のバージョン番号が、更新のために取得したバージョン値と等しい場合は、初回は更新されますが、それ以外の場合は期限切れデータとみなされます。

update TABLE
set value=2,version=version+1
where id=#{id} and version=#{version}
ログイン後にコピー

オプティミスティック ロックはデータベースには付属していないため、自分で実装する必要があります。

楽観的ロックとは、データベースの操作 (更新操作) 時に、この操作によって競合が発生しないという非常に楽観的な考え方を意味し、データの操作時に、他の特別な処理 (つまり、追加のロック) を行わず、更新後に、競合があるかどうかを判断します。全体的なアイデアはCASのアイデアです。

通常の実装は次のとおりです。テーブル内のデータを操作 (更新) する場合、まずデータ テーブルにバージョン (version) フィールドが追加され、操作が実行されるたびにバージョン番号が追加されます。そのレコードの 1 が増加します。つまり、まずレコードをクエリしてバージョン フィールドを取得し、そのレコードを操作 (更新) する場合は、まず現時点のバージョンの値がクエリしたバージョンの値と等しいかどうかを判断します。この期間中に他のプログラムが動作しない場合は、更新を実行してバージョン フィールドの値に 1 を追加できます。更新中に現時点でのバージョン値が等しくないことが判明した場合は、取得したばかりのバージョンの値に、この期間が経過したことを意味します。他のプログラムが動作している場合、更新操作は実行されません。

例:

注文操作には 3 つのステップが含まれます:

1. 在庫情報のクエリ:

select (id,count,version) from t_goodsku where id=#{id}
ログイン後にコピー

2. 2 つの在庫を差し引く:

プログラム内の計算: count = count - 2;

3. インベントリの更新:

update t_goodsku
set count={count},version=version+1
where id=#{id} and version=#{version};
ログイン後にコピー

ステップ 1 で見つかったバージョンは、実際にはスナップショットです (読み取りコミットおよび読み取り -MVCC)反復可能な分離メカニズムの下のメカニズム)、この場合、ステップ 3 で更新しようとするときに、ロックを取得し、判定する where 条件で version=#{version} を使用します。これは、実際には現在のバージョンと値を取得します。ステップ 1 スナップショットのバージョンを比較します。

比較が成功した場合は、この期間中にこのデータが他のスレッドによって更新されておらず、更新が成功したことを意味します。

比較が失敗した場合、これは、この期間のデータが更新されている場合、更新は失敗し、エラーが報告され、ロールバックまたはスピンされることを意味します。

もちろん、これは楽観的ロック シナリオをシミュレートするためです。実際、インベントリの更新は 1 つのステップで実行できます:

1. インベントリの更新:

update t_goodsku
set count=count -2
where id=#{id};
ログイン後にコピー

推奨される学習: mysql ビデオ チュートリアル

以上がmysqlで楽観的ロックを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート