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リモートコマンド実行の詳細な例

推薦する

自作メニューをクリックする効果を実現するJavaScript

この記事では、自作メニューをクリックする効果を実現するためのJavaScriptの具体的なコードを参...

CSS の 6 つの重要なセレクター (3 秒で覚える)

出典: https://blog.csdn.net/qq_44761243/article/deta...

MySQLデータベースを使い始めるための最初のステップはテーブルを作成することです

データベースを作成する右クリック - 新しいデータベースを作成ライブラリ名を入力し、文字セットと並べ...

IE6では画像要素imgに余分な空白スペースがある

ページの DIV+CSS レイアウトを行う際、IE6 で画像要素 img の下に余分なスペースができ...

mysql における mydumper と mysqldump の比較

いくつかのテーブルまたは単一のデータベースのみをバックアップする場合は、innobackup よりも...

Web ページでの Unicode 文字の使用の概要 (&#、\u など)

初期のコンピュータでは ASCII 文字しか使用できませんでしたが、コンピュータのアプリケーションの...

MySQL 8.0 をインストールした後、初めてログインするときにパスワードを変更する問題を解決する

MySQL 8.0.16で初回ログイン時のパスワードを変更する方法を紹介します。 MySQLデータベ...

Ubuntu 20.04 ベスト設定ガイド (初心者向け)

1. システム構成1. sudoパスワードをオフにするsudo コマンドを使用するたびにパスワード...

Mysql論理アーキテクチャの詳細な説明

1. 全体的なアーキテクチャ図他のデータベースと比較すると、MySQL は、そのアーキテクチャがさま...

Linux xargsコマンドの使用

1. 機能: xargs は、stdin 内のスペースまたは改行で区切られたデータをスペースで区切ら...

Vue2.x の応答性の簡単な説明と例

1. Vue レスポンシブの使用法を確認する​ Vue の応答性は、私たち全員がよく知っています。 ...

vue+echartsチャートの使用に関する問題記録

序文echarts は私が最もよく使用するチャート作成ツールであり、非常に完全なエコシステムとコンテ...

Linux環境でユーザーにsudo権限を追加する方法

sudo 設定ファイルsudo のデフォルトの設定ファイルは /etc/sudoers です。一般的...

Vueはログインタイプの切り替えを実装します

この記事では、ログインタイプの切り替えを実装するためのVueの具体的なコードを例として紹介します。具...

MySQL 8.0 WITH クエリの詳細

目次MySQL 8 の WITH クエリについて学ぶ1. 例3. 練習するMySQL 8 の WIT...