1. はじめに 行ロックとテーブルロックの違いは面接で頻繁に出てくるはずです。MySQL のロックについて体系的に理解しておく必要があります。詳細については、自分で情報を調べる必要があります。この記事は、その答えを大まかにまとめたものです。 一般的な MySQL エンジンには MyISAM と InnoDB があり、InnoDB は MySQL のデフォルト エンジンです。 MyISAM は行ロックをサポートしていませんが、InnoDB は行ロックとテーブルロックをサポートしています。 他のデータベースと比較すると、MySQL のロック メカニズムは比較的単純です。最も注目すべき特徴は、異なるストレージ エンジンが異なるロック メカニズムをサポートしていることです。 MySQL は、大まかに次の 3 種類のロックにまとめることができます。
ロックするには? クエリ ステートメント (SELECT) を実行する前に、MyISAM は関連するすべてのテーブルに読み取りロックを自動的に追加します。更新操作 (UPDATE、DELETE、INSERT など) を実行する前に、関連するテーブルに書き込みロックを自動的に追加します。このプロセスではユーザーの介入は必要ないため、通常、ユーザーは LOCK TABLE コマンドを使用して MyISAM テーブルを直接明示的にロックする必要はありません。 明示的なロック: 共有ロック (読み取りロック) を書き込む方法は、共有モードでロックすることです。例: math>60 の zje から math を選択し、共有モードでロックします。 排他ロック (書き込みロック) は、更新の場合と同じように記述されます。例: 更新のために、math >60 となる zje から math を選択します。 2. テーブルロック デッドロックは発生せず、ロック競合の可能性が高く、同時実行性は低くなります。 MyISAM エンジン クエリ ステートメント (選択) を実行する前に、MyISAM は関係するすべてのテーブルに読み取りロックを自動的に追加し、追加、削除、および変更操作を実行する前に、関係するテーブルに書き込みロックを自動的に追加します。 MySQL テーブル レベルのロックには 2 つのモードがあります。
読み取りロックは書き込みをブロックし、書き込みロックは読み取りと書き込みの両方をブロックします。
MyISAM は、書き込みロック後は他のスレッドが操作を実行できなくなり、更新回数が多いとクエリがロックを取得するのが困難になり、永続的にブロックされるため、書き込みプライマリ テーブル エンジンとしては適していません。 3. 行ロック デッドロックは発生しますが、ロック競合の可能性は低く、同時実行性は高くなります。 MySQL の InnoDB エンジンは行ロックをサポートしています。Oracle とは異なり、MySQL の行ロックはインデックスを通じてロードされます。つまり、行ロックはインデックスに対応する行に追加されます。対応する SQL ステートメントがインデックスを使用しない場合、テーブル全体がスキャンされ、行ロックは実現できません。代わりに、テーブル ロックが使用されます。このとき、他のトランザクションは現在のテーブルに対して更新または挿入操作を行うことはできません。 テーブル `user` を作成します ( `name` VARCHAR(32) デフォルト NULL, `count` INT(11) デフォルト NULL, `id` INT(11) NOT NULL AUTO_INCREMENT, 主キー (`id`) ) エンジン=INNODB AUTO_INCREMENT=7 デフォルト文字セット=utf8 -- ここでは、主キーを id としてユーザーテーブルを作成します。 -- A は主キーを使用して挿入操作を実行しますが、トランザクションはコミットされません。update user set count=10 where id=1; -- B もこの時点で更新操作を実行します: update user set count=10 where id=2; -- 主キーによって選択されるため、行レベルのロックです。A と B は同じ行に対して操作しないため、B によって実行される操作は実行可能です。-- A は名前による挿入操作を実行しますが、トランザクションはコミットされません。update user set count=10 where name='xxx'; -- B もこの時点で更新操作を実行します: update user set count=10 where id=2; -- 非主キーまたはインデックスで選択されるため、テーブルレベルのロックにアップグレードされます。 -- B はテーブルを更新または挿入できません。A がトランザクションをコミットした場合にのみ、B は正常に実行できます。 更新用 select ステートメントの後に for update を追加すると、クエリされたデータに排他ロックが追加されます。他のトランザクションはそれを読み取ることはできますが、更新または挿入操作を実行することはできません。 -- ユーザー A は、id=1 のレコードをロックします。select * from user where id=1 for update; -- ユーザー B はこのレコードに対して操作を実行できません。update user set count=10 where id=1; -- ユーザーAがコミットした後、ユーザーBはレコードを操作できる 行ロックの実装には注意が必要です。
行ロックのシナリオ: ユーザー A が購入を行うと、サービス レイヤーはまずユーザーのアカウント残高を照会します。残高が十分であれば、その後の控除操作を実行します。この場合、照会中はレコードをロックする必要があります。 それ以外の場合、ユーザー B は、ユーザー A がアカウントを照会した後に購入する前に、ユーザー A のアカウントから資金を送金し、ユーザー A はユーザーの残高が十分かどうかをすでに判断しているため、残高が不足している可能性がありますが、引き落としは成功します。 この状況を回避するには、ユーザー A がレコードを操作するときに更新ロックを実行する必要があります。 拡張機能: ギャップロック 等価条件ではなく範囲条件を使用してデータを取得し、共有ロックまたは排他ロックを要求すると、InnoDB は条件を満たす既存のデータ レコードのインデックス項目をロックします。条件範囲内にキー値が存在しないレコードについては、ギャップと呼ばれます。 InnoDBはこの「ギャップ」もロックします。このロック機構はギャップロックと呼ばれます。 -- ユーザーA ユーザーを更新し、ID>2かつID<6の場合、count=8を設定します。 -- ユーザー B ユーザーを更新し、ID=5 の箇所で count=10 を設定します。 ユーザー A が上記の操作を実行した後にトランザクションをコミットしていない場合、B は 2 から 6 までのレコードを更新または挿入できず、ブロックされます。A がトランザクションをコミットすると、B の更新操作が実行されます。 提案:
これで、MySQL の行ロックとテーブルロックの意味と違いに関するこの記事は終了です。MySQL の行ロックとテーブルロックの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: ubuntu20.04 上の CLion2020.1.3 での ROS のインストールと設定の詳細な説明
>>: Ubuntu16.04にclionをインストールするプロセス全体と手順の詳細な説明
目次スプリングブートDocker spring-boot-maven-プラグインSpotify Ma...
Dockerfileの作成yumソースを設定する cd /tmp/docker vim Docker...
目次2. 目的2.1 オブジェクトにプロパティを追加する2.3 オブジェクトの複製2.4 複数のオブ...
指定されたテーブルからデータをエクスポートするMySQLの詳細な説明必要とする: 1. テーブルはす...
目次地図フィルターいくつかの毎インデックスを検索パイプ参考回答1. パラメータを受け入れる関数を返す...
この記事では、主に js を使用して画像をモザイク化する方法の例を紹介し、次のように共有します。効果...
MySQL データベースのバージョンを 5.6.28 から 8.0.11 にアップグレード中にプロジ...
この記事では、例を使用して、MySQL 派生テーブルの簡単な使用方法を説明します。ご参考までに、詳細...
1. pc-reset PCスタイルの初期化 /* 正規化.css */ html{ 行の高さ: 1...
Unix ライクなシステムでは、コマンドまたはプロセスの実行がいつ開始されたか、またプロセスがどのく...
JSはショッピングカート内の商品の合計金額を計算して参考とします。具体的な内容は以下のとおりです。質...
ステートメント 1: <link rel="shortcut icon" ...
要件:PC側とモバイル側は2つの独立したプロジェクトです。2つのプロジェクトの内容は基本的に同じで、...
目次1. 概要1. 説明文テスト2. 結果の各列の説明2. ID列の説明1. 環境整備2. expl...
中国語ドキュメント: https://router.vuejs.org/zh/ Vue Router...