MySQLのさまざまなロックの概念的理解

MySQLのさまざまなロックの概念的理解

楽観的ロック

楽観的ロックは、主にデータ バージョン記録メカニズムに基づいて実装され、通常はデータベース テーブルに「バージョン」フィールドを追加することによって実装されます。データの読み込み時にバージョン番号も一緒に読み出され、その後更新する際にバージョン番号が1つ増加します。このとき、送信されたデータのバージョンデータは、データベーステーブル内の対応するレコードの現在のバージョン情報と比較されます。送信されたデータのバージョン番号がデータベーステーブルの現在のバージョン番号より大きい場合は更新され、そうでない場合は期限切れのデータとみなされます。

たとえば、注文する場合:

製品情報を照会します。

選択(数量、バージョン)
t_goodsより
ここで、id = #{id}

製品情報に基づいて注文を生成します。

アイテムの数量を 1 減らします。

t_goods を更新
数量 = 数量 - 1 を設定します
ここで、id = #{id}、version = #{version}

悲観的ロック

悲観的ロックは、データベースによって提供されるロック メカニズムによって実装されます。 MySQL の共有ロックと排他ロックはどちらも悲観的ロックです。デフォルトでは、データベースの追加、削除、および変更操作によって排他ロックが追加されますが、クエリではロックは追加されません。

共有ロック(読み取りロック)

共有ロックとは、複数の異なるトランザクションがリソースに対して同じロックを共有することを意味します。リソースに共有ロックを追加すると、自分でリソースを読み取ることができ、他の人もリソースを読み取ることができます (別の共有ロックを追加することもできます。つまり、共有ロックは複数のメモリを共有します) が、変更することはできません。変更する場合は、すべての共有ロックが解除されるまで待つ必要があります。構文: select * from table lock in share mode;

例えば:

ウィンドウ 1: 未完了のトランザクション内のデータに共有ロックを追加します。

始める;
SELECT * FROM t_red_pa​​cket WHERE id = 1 LOCK IN SHARE MODE;

ウィンドウ 2 は同じデータに共有ロックを追加し、ロックは成功します。

SELECT * FROM t_red_pa​​cket WHERE id = 1 LOCK IN SHARE MODE;

[Err] 1205 - Lock wait timeout exceeded; try restarting transactionが表示されます。更新操作を実行する前に、すべての共有ロックが解除されるまで待つ必要があります。

更新 t_red_pa​​cket
ユーザーIDを2に設定する

排他ロック(書き込みロック)

排他ロックとは、複数の異なるトランザクションに対して、同じリソースに対してロックが 1 つしか存在できないことを意味します。リソースに排他ロックを追加すると、そのリソースに対して追加、削除、変更、およびクエリ操作を実行できますが、他のユーザーはそのリソースをロックできず、追加、削除、および変更操作を実行することもできません。構文: select * from table for update .

ウィンドウ 1: 未完了のトランザクション内のデータに排他ロックが追加されます。

始める;
SELECT * FROM t_red_pa​​cket WHERE id = 1 FOR UPDATE;

ウィンドウ 1、行データを正常に更新しました。

更新 t_red_pa​​cket
ユーザーIDを2に設定する

ウィンドウ 2 で、データ行をクエリすると、その行を見つけることができます。

t_red_pa​​cket から * を選択 WHERE id = 1

ウィンドウ 2 はデータをロックし、 [Err] 1205 - Lock wait timeout exceeded; try restarting transaction 。というプロンプトを表示します。

SELECT * FROM t_red_pa​​cket WHERE id = 1 FOR UPDATE;

要約すると、共有ロックとは、全員が一緒に読み取り、ロックを共有するが、ロックされたデータを変更できる人はいないことを意味します。排他ロックとは、変更したいだけで、読み取りはできるが、ロックしたりデータを変更したりできないことを意味します。

行ロック

行ロックはデータの行をロックすることです。

テーブルロック

テーブル ロックはテーブルをロックすることです。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Mysqlは実行中のトランザクションを照会し、ロックを待機する方法
  • 更新SQL文に基づくMySQLロックの理解
  • PHPはMySQLロックを使用して高同時実行性を解決する
  • PHP+MySQL の高同時ロックトランザクション処理問題の解決方法
  • MySQL のロックの仕組みと使用法の分析
  • MySQL でメタデータ ロックがブロックされている場所を確認する方法
  • MySQL ステートメントロックの実装の分析
  • Mysql は、デッドロック問題を解決するために kill コマンドを使用します (実行中の特定の SQL ステートメントを強制終了します)。
  • MYSQL ロック解除とロックテーブルの紹介
  • MySQL デッドロックのトラブルシューティング プロセスの完全な記録

<<:  Linux で独自の Nexus プライベート サーバーを構築する方法

>>:  アプレットにおけるwx.getUserProfileインターフェースの具体的な使用

推薦する

VMware に Linux システム (Redhat8) と仮想マシンのネットワーク構成をインストールする方法

目次1. VMwareをインストールする1.1 VMwareworkstationsをダウンロードし...

1 つの記事で Vue ミドルウェア パイプラインを学ぶ

SPA を構築する場合、多くの場合、特定のルートを保護する必要があります。たとえば、認証されたユーザ...

Windows での mysql-5.7.28 のダウンロード、インストール、および構成に関する詳細なグラフィックとテキストのチュートリアル

最近MySQLデータベースのバージョンを変更する必要があり、それを記録するために記事を書きます1. ...

Nginxホットデプロイメントの実装

目次セマフォNginx ホットデプロイメント上記のブログ投稿に従ってください。ファイアウォールをオフ...

データベース接続のURLの詳細な説明と概要

データベース接続のURLの詳細な説明と概要JDBC URL = プロトコル名 + サブプロトコル名 ...

Divの境界と透明度に関する設定

フレーム:スタイル=”border-style:solid;border-width:5px;bor...

MySQL トランザクション分離レベルの表示と変更の例

トランザクション分離レベルを確認するMySQL では、'%tx_isolation%'...

HTML における相対と絶対の使用法と違いの詳細な説明

HTML における相対と絶対の違い: 正直に言うと、HTML は世界で最もシンプルな言語です。タグ言...

MySQL の時間タイプとモードの詳細

目次1. MySQL の時刻型2. タイムゾーンを確認する3. 不正な時間値4. 厳密モード5. 事...

Vue コンポーネントはどのように解析され、レンダリングされるのでしょうか?

序文この記事では、Vue コンポーネントがどのように解析され、レンダリングされるかを説明します。 V...

MySQL で左結合を使用して where 条件を追加する問題の詳細な分析

現在の需要:グループとファクターの 2 つのテーブルがあります。1 つのグループは複数のファクターに...

Docker で MySQL クラスターを構築する方法の例

Docker の基本的な手順:アップデートパッケージ yum -y アップデートDocker仮想マシ...

Ubuntuでネットワークルーティングテーブルを表示する方法

Linux におけるルーティングとルーティング テーブルとは何ですか?ルーティングのプロセスとは、ネ...

Zabbix と bat スクリプトを組み合わせて複数のアプリケーションの状態を監視する方法

シナリオシミュレーション:国内企業の中には、重要な業務をサポートするために特定のウィンドウ プログラ...