この記事は、MySQL のロックを理解し、ロックの粒度分類とロックの互換性分類を紹介するのに役立ちます。
高同時実行シナリオでは、他のミドルウェアを考慮せずに、次のシナリオがデータベースに存在します:
上記の問題に対応して、SQL 標準では、異なる分離レベルでは異なる問題が発生する可能性があると規定しています。
MySQL の 4 つの主要な分離レベル:
分離レベル | ダーティ リード | 反復不可能な読み取り | ファントム リード | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
解決策 | 起こる可能性がある | 起こる可能性がある | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
解決策 | 解決策 | 考えられる出来事 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
解決策 | 解決策 | 解決策 |
#行ロック | テーブル ロックページ ロック | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
大 | 2つの間の | ロックの効率を追加 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
速い | 両者の間 | 競合確率 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
高 | - | ##同時実行パフォーマンス | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
低 | 一般 | パフォーマンスのオーバーヘッド | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
小さな | 2 つの間にデッドロックはありますか | かどうか | # |
S | IS | XXIX | |||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
互換性あり互換性あり | 互換性なし | 互換性なし | は | ||||||||||||||||||||||||||||||||||||||||||||
互換性あり互換性あり | 互換性なし | 互換性なし | XX | ||||||||||||||||||||||||||||||||||||||||||||
互換性がありません互換性がありません | 互換性がありません | 互換性がありません | IS | ||||||||||||||||||||||||||||||||||||||||||||
互換性あり #互換性あり #互換性なし | #互換性なし#4.3 読み取り操作のロックMySQL 読み取り操作の場合、ロックするには 2 つの方法があります。 1️⃣ SELECT * FROM table LOCK IN SHARE MODE 現在のトランザクションがこのステートメントを実行すると、読み取りレコードに S ロックが追加されます 、これにより、他のトランザクションはこれらのレコードの S ロックを取得し続けることができます (たとえば、他のトランザクションも 他のトランザクションがこれらのレコードの X ロックを取得したい場合、現在のトランザクションがコミットした後にこれらのレコードの S ロックが解放されるまでブロックされます。 2️⃣ SELECT FROM table FOR UPDATE 現在のトランザクションがこのステートメントを実行すると、読み取りレコード に X ロック が追加され、他のトランザクションがこれらのレコード S ロックを取得できなくなります (たとえば、 、他のトランザクションはこれらのレコードを読み取るために 他のトランザクションがこれらのレコードの S ロックまたは X ロックを取得したい場合、現在のトランザクションがコミットされた後にこれらのレコードの X ロックが解放されるまでブロックされます。 4.4 書き込み操作のロックMySQL 書き込み操作では、DELETE、UPDATE、INSERT が一般的に使用されます。暗黙的ロック、自動ロック、ロック解除。 1️⃣ DELETE レコードに対して DELETE 操作を実行するプロセスでは、まず B ツリー内のレコードの位置を特定し、次にレコードのXロックしてからマーク削除操作を行ってください。 B ツリー内で削除するレコードの位置を特定するこのプロセスは、X ロックを取得するロック読み取りと考えることもできます。 2️⃣ INSERT 通常の状況では、新しいレコードの挿入操作はロックされません。InnoDB は、この新しいレコードを一種の暗黙的ロックを通じて保護します。挿入されたレコードこのトランザクションがコミットされるまで、他のトランザクションからアクセスされることはありません。 3️⃣ UPDATE レコードに対して UPDATE 操作を実行する場合は、次の 3 つの状況があります。 ① レコードのキー値が変更されていない場合更新された列が占める記憶領域が変更の前後で変わっていない場合は、最初に B ツリー内でこのレコードの位置を特定し、次にレコードの X ロックを取得し、最後に変更操作を実行します。元のレコードの位置。実際、B ツリー内で変更されるレコードの位置を特定するこのプロセスを、X ロックを取得するためのロックされた読み取りとみなすこともできます。 ② レコードのキー値が変更されておらず、少なくとも 1 つの更新された列が占める記憶領域が変更の前後で変化している場合は、まず B ツリー内でこのレコードの位置を見つけます。レコードを X ロックし、レコードを完全に削除し (つまり、レコードをガベージ リストに完全に移動し)、最後に新しいレコードを挿入します。 B ツリー内で変更されるレコードの位置を特定するこのプロセスは、X ロックを取得するためのロックされた読み取りとみなされ、新しく挿入されたレコードは、INSERT 操作によって提供される暗黙的なロックによって保護されます。 ③ レコードのキー値が変更された場合、元のレコードに対して DELETE 操作を実行してから INSERT 操作を実行するのと同じであり、ロック操作は DELETE と DELETE の規則に従って実行する必要があります。入れる。 PS: 書き込みロックがロックされているときに、他のトランザクションが引き続き読み取りできるのはなぜですか?? InnoDB には MVCC 機構 (マルチバージョン同時実行制御) があるため、スナップショット読み取りがブロックされることなく使用できます。 4. ロック粒度の分類ロック粒度とは何ですか。いわゆるロックの粒度は、ロックする対象の範囲を指します。 たとえば、自宅のトイレに行く場合、バスルームをロックするだけで済みます。家族の侵入を防ぐために家全体をロックする必要はありません。バスルームはロックの粒度です。 適切なロック粒度はどれくらいですか? 実は、バスルームはトイレに行くだけでなく、シャワーを浴びたり手を洗うためにも使用されます。これには、ロックの粒度を最適化するという問題が含まれます。 あなたがバスルームでシャワーを浴びるとき、隔離されていれば、他の人が同時に入って手を洗うことができます。トイレ、浴槽、洗面台がすべて分離されており、比較的独立している場合は、 (湿式と乾式が分かれています) 実はこのトイレは3人同時に使えますが、もちろん3人で同じことはできません。これにより、ロックの粒度が向上し、シャワーを浴びるときにバスルームのドアを閉めている限り、他の人が入って手を洗うことができます。バスルームを最初に設計するときに、さまざまな機能エリアが分割および分離されていない場合、バスルームのリソースを最大限に活用することはできません。 同様に、MySQL にもロックの粒度があります。通常、行ロック、テーブル ロック、ページ ロックの 3 つのタイプに分かれます。 4.1 行ロック 共有ロックと排他ロックの紹介では、これらは実際には特定の行に対して記録されるため、行ロックとも呼ばれます。レコードのロックはこのレコードにのみ影響するため、行ロックのロック粒度は MySQL で最も細かくなります。 InnoDB ストレージ エンジンのデフォルトのロックは行ロックです。 これには次の特徴があります:
4.2 テーブル ロックテーブル レベルのロックは、テーブル レベルのロックです。テーブル全体をロックします。これにより、デッドロックを大幅に回避できます。これは、MySQL で最も詳細なロック メカニズムでもあります。 MyISAM ストレージ エンジンのデフォルトのロックはテーブル ロックです。 これには次のような特徴があります。
1、开启 A、B 两个事务; 2、首先 A 先查询 3、在 B 没释放锁的情况下,A 尝试对 4、若此时,事务 B 在没释放锁的情况下尝试对 此时,MySQL 检测到了死锁,并结束了 B 中事务的执行,此时,切回事务 A,发现原本阻塞的 SQL 语句执行完成了。可通过 如何避免 从上面的案例可以看出,死锁的关键在于:两个(或以上)的 Session 加锁的顺序不一致,所以我们在执行 SQL 操作的时候要让加锁顺序一致,尽可能一次性锁定所需的数据行。 【相关推荐:mysql视频教程】 |
以上がMySQL がロックと分類について学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。