MySQL には多くのロックがあるようです。
テーブル ロック、行ロック、ページ ロックとは何ですか
共有ロック、排他ロック、意図ロック、読み取りロック、書き込みロック。
悲観的なロック、楽観的なロック。 。
行きます、本当に聞きたいのですが、ゴールデンロックはありますか?ファン・ビンビンはまだいるよ。 。 。
ああ、なぜ私はこんなにめちゃくちゃな気分になるのでしょう。それでは、整理してまとめてみましょう。
innodb での mvcc の理解と例もあります。同時アクセス下で効率的で一貫したアクセスを維持するにはどうすればよいですか?シンプルでわかりやすいです。大企業も面接でよく質問すると聞きました。
テーブル/行/ページロック:
テーブルレベルのロック: MyISAM および MEMORY ストレージ エンジン
行レベルのロック: InnoDB ストレージ エンジン
ページ レベルのロック: BDBストレージ エンジン
テーブル レベルのロック: 低いオーバーヘッド、低い同時実行性、高速なロック、ロックの粒度が大きい、問題なし。ロックの競合の可能性が最も高く、同時実行性の程度も高くなります。最低。
行レベルのロック: オーバーヘッドが高く、同時実行性が高く、デッドロックが発生する可能性があります。ロックの粒度は最も小さく、ロック競合の可能性は最も低く、同時実行性は最も高くなります。 ページ ロック: コストとロック時間はテーブル ロックと行ロックの間であり、デッドロックが発生します。ロックの粒度はテーブル ロックと行ロックの間であり、同時実行性は平均的です。
共有/排他ロック
共有ロックは読み取りロックとも呼ばれ、読み取り操作によって作成されるロックです。他のユーザーは同時にデータを読み取ることができますが、すべての共有ロックが解放されるまで、トランザクションはデータを変更する (データの排他的ロックを取得する) ことはできません。
排他ロックは書き込みロックとも呼ばれます。トランザクション T がデータ A に排他ロックを追加した場合、他のトランザクションは A にいかなる種類のブロックも追加できません。排他的ロックが付与されたトランザクションは、データの読み取りと変更の両方が可能です。
Mysiam ロック モード
MyISAM は、クエリ ステートメント (SELECT) を実行する前に、関係するすべてのテーブルに読み取りロックを自動的に追加し、更新操作 (UPDATE、DELETE、INSERT) を実行する前に、関係するすべてのテーブルに読み取りロックを自動的に追加します。 、など) テーブルに書き込みロックを追加します。
a. MyISAM テーブルに対する読み取り操作 (読み取りロックの追加) は、同じテーブルに対する他のプロセスの読み取りリクエストをブロックしませんが、同じテーブルに対する書き込みリクエストは読み取りロックが解放された後にのみ実行されます。書き込み操作。
b. MyISAM テーブルへの書き込み操作 (書き込みロックの追加) は、同じテーブルに対する他のプロセスの読み取りおよび書き込み操作をブロックします。書き込みロックが解放された場合にのみ、他のプロセスの読み取りおよび書き込み操作が実行されます。 。
innodb ロック モード
インテンション ロックは InnoDB によって自動的に追加され、ユーザーの介入は必要ありません。
挿入、更新、および削除の場合、InnoDB は関連するデータに排他ロック (X) を自動的に追加しますが、一般的な Select ステートメントの場合、InnoDB は次の方法で共有ロックまたは排他ロックを表示できます。ステートメントをロックします。
共有ロック: SELECT ... 共有モードでロック;
排他ロック: SELECT ... FOR UPDATE;
MVCC(マルチバージョン同時実行制御)
理解するのが難しい概念ですが、多くの情報やブログを参照しましたが、ここでは簡単でわかりやすい説明を示します。
シナリオシミュレーション:
高い同時実行性の前提の下では、この前提に注意する必要があります。
トランザクション L1 は特定のテーブルの D のキー値を変更しますが、まだ送信されていません。
トランザクション L2 も D のキー値を変更して送信し、その後 L1 が送信します。
何が起こったのですか?
L1はD
Lからkey:123に対応する値100を読み取ります。 1 は値を 1 増やします, 更新キー:123 to 100 + 1
L2ペアの値が2増加、更新キー:123 to 100 + 2
L1とL2がシリアルに実行される場合、key:123が対応します値は103となりますが、上記の同時実行におけるL1の実行効果はL2で完全にカバーされ、key:123に対応する実際の値は102となります。 L1 トランザクションが送信されなかったため、再び L2 が来ました。
それでは、どうやって対処すればいいのでしょうか?
方法 1:
ロックを追加します。以前にこのロックの問題について話したことはありませんか? 書き込みロックを追加し、L1 の実行が完了するのを待ってから L2 を実行します。可能ですが、キューが発生し、同時実行性が低下します。これは一種の悲観論であり、ロックベースの同時実行制御マシンは一般に悲観的メカニズムと呼ばれます。
方法 2:
シリアル化を実現し、ロックメカニズムに関するさまざまな問題を回避するために、マルチバージョン同時実行制御 (MVCC) の考えに基づいて を使用できます。無料の同時実行メカニズム がついに私が言いたいことを明らかにしました!一般に、ロックベースの同時実行制御マシンを悲観的メカニズム (悲観的ロック)と呼ぶのに対し、MVCC などのメカニズムは楽観的メカニズム (楽観的ロック) と呼ばれます。バージョン番号を追加するメカニズム。D は、データが更新されるたびにバージョン番号を増やし、トランザクションの一貫性と高同時実行性の問題をより効率的に管理できます。
ロックメカニズムは予防的であるため、読み取りは書き込みをブロックし、書き込みも読み取りをブロックします。ロックの粒度が大きく、時間が長い場合、同時実行パフォーマンスはあまり良くありません。 a 事後的には、読み取りは書き込みをブロックせず、書き込みは読み取りをブロックしません。ロックがないため、読み取りと書き込みが相互にブロックされず、同時実行性が大幅に向上します。パフォーマンス。 上記は、Mysql のさまざまなロックの区別と MVCC の詳細な説明です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) を参照してください。