高同時実行シナリオでは、他のミドルウェアを考慮せずに、データベースに次のシナリオが存在します。
Read: 問題はなく、同時実行制御は必要ありません。
読み取りと書き込み: スレッド セーフティの問題があり、トランザクション分離の問題が発生する可能性があり、ダーティ リード、ファントム リード、および反復不可能な読み取りが発生する可能性があります。
Write: スレッドの安全性の問題があり、最初の種類の更新が失われ、2 番目の種類の更新が失われるなど、更新損失の問題が発生する可能性があります。失った。
ダーティリード | 反復不可能な読み取り | ファントムリード | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
発生する可能性があります | 発生する可能性があります | 発生する可能性があります | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ソリューション | 起こる可能性がある | 起こる可能性がある | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ソリューション | 解決策 | 発生する可能性のある現象 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
解決策 | 解決策 | solve# ################################## |
#行ロック | テーブル ロックページ ロック | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
大 | 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 書き込み操作のロックDELETE、UPDATE、および INSERT は、MySQL の一般的な書き込み操作です。暗黙的ロック、自動ロック、ロック解除。 1️⃣ DELETE レコードに対して DELETE 操作を実行するプロセスは、実際には、まず B ツリー内のレコードの位置を特定し、次に、レコードの X ロックを解除してから、マークの削除操作を実行します。このプロセスは、X ロックを取得するロック読み取りメソッドを使用して、B ツリー内で削除されるレコードの位置を特定すると理解することもできます。 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 のロックと分類とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。