MySQL の悲観的ロックと楽観的ロックの使用例

MySQL の悲観的ロックと楽観的ロックの使用例

悲観的ロック

悲観的ロックは、データを悲観的であるとみなします。データをクエリするときに、ロックを追加します。ロックを取得するまで他のスレッドによる改ざんを防止します。

例えば、次の表があります。 status=1 は注文が可能であることを意味します。status=2 は注文が不可能であることを意味します。同時実行プロセス中に 2 人のユーザーが同時にステータス = 1 をチェックすると、論理的には両方のユーザーが新しい注文を追加できますが、これにより製品の過剰販売が発生します。

次の例

テーブル「goods」を作成する(
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) デフォルト NULL,
 `status` tinyint(4) デフォルト NULL,
 `version` int(11) デフォルト NULL,
 主キー (`id`)
) エンジン=InnoDB AUTO_INCREMENT=2 デフォルト文字セット=utf8mb4
demo.goods (id、name、status、version) に VALUES (1、'test'、1、1) を挿入します。

セッション1の実行

自動コミットを0に設定します。
始める;
*を選択
id=1 かつ goods.status=1 の goods から更新します。
商品を更新します。ID=1 の場合、ステータスを 2 に設定します。

セッション2実行

始める;
更新のために、id=1 の商品から * を選択します。

この時点では、ロックがまだセッション 1 にあるためセッション 2 はブロックされており、ロックは常に待機状態になっています。セッション1が送信されない場合、セッション2は一定時間後にタイムアウトして切断され、

(1205、「ロック待機タイムアウトを超えました。トランザクションを再起動してください」) エラー、

特定のロック待機時間は、innodb_lock_wait_timeout パラメータを設定することで制御できます。

この時点でセッション 1 でコミット操作が実行されると、セッション 2 はクエリ結果を取得し、ロックはセッション 2 に与えられます。

また、

'innodb_row_lock_%' のようなステータスを表示します。

ロック情報をさらに表示します。

楽観的ロック

楽観的ロックは悲観的ロックとは異なります。楽観的ロックは、mySql 自体ではなく、独自のプログラムを通じて実装されます。

楽観的ロックではクエリはロックされず、更新時にバージョン番号のみがチェックされます。

例えば、goodsテーブルをクエリしてバージョンが1であることがわかった場合、このテーブルを更新すると、SQLは次のようになります。

id=1 の商品から * を選択します。
商品を更新します。ステータスを 2、バージョンをバージョン + 1 に設定します (ID は 1、バージョンは 1)。

ここでのバージョンはクエリ時のバージョン番号であり、変更するたびにバージョンが +1 になります。バージョン番号が一致しない場合は更新は成功しません。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL における楽観的ロックと悲観的ロックの例
  • MySQL の悲観的ロックと楽観的ロックの理解と応用分析
  • MySQL における楽観的ロック、悲観的ロック、MVCC の包括的な分析
  • MySQL における悲観的ロックと楽観的ロック
  • MySQL 悲観的ロックと楽観的ロックの実装

<<:  Vueは物流タイムライン効果を実現します

>>:  Zabbixリモートコマンド実行の詳細な例

推薦する

jsはCanvasを使用して複数の画像を1つの実装コードにマージします

解決 関数 mergeImgs(リスト) { const imgDom = document.cre...

MySQL の current_timestamp の落とし穴とその解決策を共有する

目次MySQL の current_timestamp の落とし穴エラーを報告する私の解決策mysq...

ウェブページの背景画像を伸ばす2つの方法

解決策は2つあります。 1つはCSSで、background-size:coverを使用して画像の伸...

一定期間の日ごと、時間ごとの統計データを取得するMySQLの詳しい説明

毎日の統計情報を取得するプロジェクトを実行する際、プロジェクト ログを分析する必要があります。要件の...

Dockerfile を使用したカスタムイメージの構築の実装

目次序文Dockerfile の紹介Dockerfileはイメージプロセスを構築するDockerfi...

Dockerコンテナオーケストレーション実装プロセス分析

実際の開発環境や本番環境では、コンテナを独立して実行することはあまりなく、複数のコンテナを一緒に実行...

CSS3 アニメーション – ステップ機能の説明

最近、CSS3 アニメーションのソース コードの実装をいくつか見ていたところ、CSS コード アニメ...

Vueのドラッグ可能なコンポーネントであるVue Smooth DnDの使用方法の詳細な説明

目次紹介とデモAPI: コンテナ財産ライフサイクルコールバックイベントAPI: ドラッグ可能実際の戦...

CSS 疑似要素と疑似クラスの魔法のような使い方についての簡単な説明

CSS は Web ページで非常に重要な役割を果たします。近年の CSS の発展に伴い、疑似要素/疑...

Vue の状態管理: Vuex の代わりに Pinia を使用する

目次1. ピニアとは何ですか? 2. Piniaは使いやすい3. ユーザーエクスペリエンス1. ピニ...

docker で nginx+php+mysql を設定する方法

まず、方法を理解します。 docker exec を使用して Docker コンテナに入るDocke...

InnoDB の主な機能 - 挿入キャッシュ、2 度書き込み、適応ハッシュ インデックスの詳細

InnoDB ストレージ エンジンの主な機能には、挿入バッファ、二重書き込み、適応ハッシュインデック...

MySQLをシンプルに学ぶ

序文データベースは常に私の弱点でした。自分の経験 (python+sqlalchemy) を組み合わ...

Promiseの紹介と基本的な使い方の簡単な分析

Promise は、ES6 で導入された非同期プログラミングのための新しいソリューションです。 Pr...

h1、h2、h3タグを適切に使用する

Web ページを作成する過程では、<h1>、<h2>、<h3> ...