前面に書かれた データベースは本質的に共有リソースであるため、同時アクセスのパフォーマンスを最大化する一方で、各ユーザーが一貫した方法でデータを読み取り、変更できることを保証する必要があります。ロックはこの種の問題を解決する最善の手段です。 まず、id を主キー、name をセカンダリ インデックス、address を一意のインデックスとして、新しいテーブル test を作成します。 テーブル「test」を作成します( `id` int(11) NOT NULL AUTO_INCREMENT, `name` int(11) NOT NULL, `アドレス` int(11) NOT NULL, 主キー (`id`)、 ユニークキー `idex_unique` (`address`)、 キー `idx_index` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=7 デフォルト CHARSET=utf8mb4; INSERTメソッドの行ロック 2 つのトランザクションが同じ主キーを持つ行レコードに対して INSERT 操作を連続して実行する場合、トランザクション A が最初に行ロックを取得するため、トランザクション B はトランザクション A がコミットされた後に行ロックが解除されるまでしか待機できないことがわかります。同様に、一意のインデックス フィールド アドレスにデータを挿入する場合も、行ロックを取得する必要があります。図は主キーの挿入プロセスに似ているため、ここでは繰り返しません。
Update メソッドは Insert メソッドと同様の結果をもたらします。 SELECT FOR UPDATE でのテーブルロックと行ロック トランザクション A の SELECT FOR UPDATE ステートメントは、テーブル test のテーブル ロックを取得します。このとき、トランザクション B は挿入操作の実行時にブロックされます。トランザクション A がコミットしてテーブル ロックを解除した後でのみ、トランザクション B は対応する行ロックを取得し、挿入操作を実行できます。
セカンダリインデックスのギャップロック まず、テスト テーブルの下のデータを見てみましょう。 mysql> テストから * を選択します。 +----+------+---------+ | ID | 名前 | 住所 | +----+------+---------+ | 3 | 1 | 3 | | 6 | 1 | 2 | | 7 | 2 | 4 | | 8 | 10 | 5 | +----+------+---------+ セット内の 4 行 (0.00 秒) ギャップ ロックは行ロックの一種と言えます。違いは、範囲内のレコードをロックすることです。その機能は、ファントム リード、つまり間隔データ エントリの突然の増加または減少を回避することです。主な解決策は次のとおりです。
InnoDB がギャップ ロックを自動的に使用するための条件は次のとおりです。
InnoDB は、インデックス レコードをスキャンするときに、最初に選択したインデックス行レコードに行ロックを追加し、次にインデックス レコードの両側のギャップにギャップ ロックを追加します (指定されたパラメータより小さい最初の値を見つけるために左にスキャンし、指定されたパラメータより大きい最初の値を見つけるために右にスキャンして、間隔を構築します)。ギャップがトランザクション A によってロックされている場合、トランザクション B はこのギャップにレコードを挿入できません。
例を見てみましょう。テーブルを作成するときに、補助インデックスとして名前列を指定します。現在、この列の値は[1,2,10]です。ギャップの範囲は (-∞, 1], [1,1], [1,2], [2,10], [10, +∞) です。 ラウンド1:
第2ラウンド:
第3ラウンド:
InnoDB ロックメカニズムの概要 参考文献
要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
<<: Websocket に基づくシンプルなチャットルームダイアログの実装
>>: CentOS 8 カスタム ディレクトリ インストール nginx (チュートリアルの詳細)
1. MySQLをインストールします。対応するソフトウェアをインストールするには、次の 3 つのコマ...
この記事では、クリックするとランダムグラフィックの生成を実現するJavaScriptの具体的なコード...
序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...
1. オンライン チュートリアルによると、Ubuntu 18.04 のインストールはまだ失敗します。...
最近、C# を使用して Web プログラムを作成していたときに、次のような問題が発生しました。 Te...
1. ダウンロード2. 減圧3. パス環境変数を追加し、mysqlが配置されているbinディレクトリ...
背景ご存知のとおり、JavaEE プロジェクトを開発した後は、そのプロジェクトをサーバーの Tomc...
前提条件クラウドサーバー(Alibaba Cloud、Tencent CloudなどのcentOS)...
(I) mysql5.7のインストール: ❀詳細:無料のグリーンバージョン5.7のインストール方法は...
1. MySQLをシャットダウンする [root@localhost /]# サービスmysqldを...
目次ケースシナリオ問題を解決するまとめケースシナリオ本日、オンラインで問題が発見されました。監視範囲...
SSH の正式名称は Secure SHell です。 SSH を使用すると、送信されるすべてのデ...
目次vue2.x vue3.x tiny-emitterプラグインの使用Mittプラグインの使用vu...
目次1. JavaScriptはシングルスレッドです1. 同期タスク2. 非同期タスク2. タスクキ...
序文私はプログラマーとしてスタートした PHP プログラマーです。これまで、トレーニング コースで勉...