MySQLはあなたが後方に見てロックされません

データベースのロックの知識

開発中の多くの人々は、これらのロックは、我々はそれらの知識をロックしていない場合でも、めったに問題ではない、とまれ(これらの在庫精度要求の高い数の場合を除く)は、プログラムのロックを与えることに留意すべきです一般的に、私たちのプログラムはまだ正常に実行することができます。私たちを助けるために、データベースが暗黙のうちに追加これらのロックなので、特定のシナリオのみで、手動でロックする必要があります。

UPDATEの場合、DELETE、INSERT文は、InnoDBは自動的にデータ・セットに加えて、排他ロックを関与させる(X)のMyISAM SELECTをクエリを実行する前に、自動的にテーブルプラスの前に、追加、削除、変更操作の実装に関わる読み取りロックのすべてを与えるだろう、自動的に関連するテーブルの書き込みロックに追加され、このプロセスは、ユーザーの介入を必要としません。

テーブルロック

まず、ロックサイズは、我々は2つのカテゴリに分けることができる:
表ロック:小さいオーバーヘッド、ロック高速;ていないデッドロック、大ロック強度、ロック競合、同時実行の最低度の高い確率
行ロック:大きなオーバヘッドを、プラス低速ロック、デッドロックが存在することになる。ロック小型、ロック競合の確率が低い、異なるストレージエンジン支持高い並行処理ロック粒度は同じ==ない:のInnoDBテーブルロックと行ロックがサポートされ、MyISAMテーブルのみサポートロック!唯一のインデックス条件によってInnoDBは、そうでない場合==行レベルのロックを使用する前に、データを取り出すのInnoDB行ロックがインデックスに基づいており、InnoDBのテーブルロックが言うことです使用します!

次の表ロックは二つのモードに分かれています。テーブルの上に読み取りロック(表リードロック)&&テーブルの書き込みロック(テーブル書き込みロック)
はっきり表中の下のグラフから分かるように、ロックと書き込みロックテーブルの環境をお読みください。読んでいませんブロックについて書くために、読み取りと書き込みをブロックし、ブロックします!読み取りがブロックされない:現在のユーザーがデータを読み取るために、他のユーザーがデータを読んでいる、いないロック・ライトブロック:データを読み込むため、現在のユーザーが、他のユーザーは、現在のユーザーデータが読み込まれ、変更することはできませんが、それがロックされます!書き込み障害物:データを修正するために、現在のユーザーは、他のユーザーがロックされるデータを変更している現在のユーザーを変更することはできません!

 

 

 

私たちは、上から見てきた:読み取りと書き込みロックは相互に排他的で、シリアル読み取りおよび書き込み操作です。

  • プロセスが別のプロセスが書き込みロックを取得しようとする一方で、読み込みロックを取得したい場合。MySQLでは、読み取りロックへの書き込みロックが優先です!

  • max_write_lock_countと低優先度の更新:書き込みロックと読み取りロックの優先課題は、パラメータにより調整可能です

注意:

 

 

 行ロック

InnoDBテーブルとMyISAMの2つの本質的な違いがあります:InnoDBは、行ロック、InnoDBのサポートトランザクションをサポートしています

InnoDBは行ロックは、次の2種類を実装します。

  • 共有ロック(Sロック、ロック読み取り):トランザクションが排他ロックを設定し、同じデータを取得するために他のトランザクションを防ぐために、行を読み取ることができます。つまり、複数のクライアントが同時に同じリソースを読み取ることができますが、他のクライアントが変更することはできません。

  • 排他ロック(Xロック、書き込みロック):、彼は排他的ロックトランザクションの更新データを取得することができます読み取るために、他の取引を防止し、書き込みロックは、同じデータセットを取得します。書き込みロックは排他的な書き込みロックは、他の書き込みロックと読み取りロックをブロックしています。

さらに、行およびテーブルのロック、マルチ粒度ロック機構、InnoDBのが意図的ロック(意図ロックの)内部使用の二種類の共存を可能にするために、両方の意図ロックテーブルロックです。

  • 意図共有ロックは、(IS):トランザクションはロックがテーブルの上にロックIS取得する必要があり、共有データ線にトランザクションの前にロックを共有データ行の行を追加していきます。

  • 意図排他ロック(IX):権利は、データライン行排他ロックに追加していき、トランザクションがデータ行の行を追加して、テーブルの上に彼のロックIXロック前に取得する必要があります。

  • 意図的ロックはまた、私たちはそれを助けるために、暗黙的なデータベースです、プログラマは注意が必要ありません!

MVCC

MVCC(マルチバージョン並行性制御)マルチバージョン同時実行制御、あなたは単純に考えることができます:MVCCは、行レベルロック(アップグレード版)の変形です。私たちは、ブロックされているテーブルロックで読み取る同時パフォーマンスに基づいてアップグレードを検討し、MVCC一般読者には(ロック操作を避けるために、多くのケースで)ブロックされていません。
データベースへの変更は、直接上書きデータの前に提出されることはありませんが、完全から、そのため読み出し時間を新バージョンと旧バージョンの共存をアンロック:これは単に、として理解することができます。

トランザクション分離レベル

トランザクション分離レベルは、4つの種類があり、ロック機構、最終的にはトランザクションの分離の異なるレベルにつながったアプリケーションロックを介して達成されるが、ロックの詳細を隠し、トランザクション分離レベル:

  • 非コミット読み取り:あるだろう汚れは非反復可能読み取り、ファントム読み取り、読み取っ

  • 読み取りコミット:非反復可能読み取り、ファントム読み取りがあるでしょう

  • 反復可能読み取りは:マジック読書(MySQLのデフォルトの分離レベルを、しかしギャップと反復は、ロックがファントム読み取りが表示されません読んで!)が表示されます

  • 直列化:シリアル、上記のような状況を避けるために

読み取りUNCOMMITTED:現象が--->ダーティ読み:、Bへの転送Aは転送文を実行し、まだ取引が登録されていませんデータBを読み込む:トランザクションが別のトランザクションのコミットされていない、例のデータを読み込み、見つかった彼の口座のお金はあまり変わって!AとBは、私はお金を受け取っています。[ロールバック]ロールバックなどBは、その後、お金のアカウントを確認し、これ以上のお金ことが判明した場合など、取引、...

読み取りコミット:現象が--->反復不能読み取り:トランザクションは別のトランザクションにデータを読み込むには、提出された、トランザクションのような他のトランザクションによる変更、見ることができます。データを取得するクエリのデータベースを、 Bは、データベースクエリの結果が同じでない多くの回で得られた、データベース内のデータを変更する[ハザード:各クエリの結果Bの影響を受けている、無楽しい情報アウト、チェック]

反復可能読み取り:避け非反復可能読み取りトランザクションレベルのスナップショット!彼らは読むたびは、それらが変更された場合でも、トランザクションの現在のバージョンである、それだけの現在のバージョンでのトランザクション・データを読み込みます

 

 

ダミーリード(マジックリーディング)のように:それは矛盾読み出し、その結果、他の取引データを挿入するリードトランザクションを指します。そして、非リピータブル・リードが、ファントム(ファントムリード)を読み込み似たその他の事項にデータを読み込みます、矛盾を読み取りリード、ファントムがフォーカスを追加または削除することである(データ量の変化)を読み取り、反復不能読み取りフォーカス修正され、ファントム読み取りおよび繰り返し不可の違いは?

楽観と悲観的ロック

かどうか反復可能読み取りは、分離レベルを犯し読み書き読みが紛争の問題に対処するために作られていますが、今、質問を考える:データベーステーブルUSER、IDのみ、名前のフィールドがあり、同時にテーブルAを動作させる2つの要求があり、次の通り: (アナログ紛失更新、非常に適切ではないが)
 1動作1 =クエリ名が「zhangsan」
 2.操作= 2はまた、名称「zhangsan」チェック
 3.操作名フィールド、データ変更とリージに提出
 4.操作を2名前フィールドのデータとwangwuに修正提出

その後、操作の更新は、物質の損失、すなわち、トランザクションが更新結果は、上記のアップデートは、次の3つの方法を失った解決するために、他のトランザクションをカバーして更新します。

  • Serializableの分離レベルを使用して、トランザクションはシリアルで実行されます!

  • オプティミスティック・ロック

  • ペシミスティック・ロック

ペシミスティック・ロック

我々は非常に単純です(マニュアルプラスライン上の行ロック)ペシミスティック・ロック・言葉を使用します、更新のためXXXXから*排他ロック(書き込みロック)の後に追加することへの更新と同等のためのプラスの背後にあるselect文、プラス書き込みロックを選択し、他のトランザクションは、それを変更することはできません!変更は変更することができる。つまり、操作が選択使用している場合...更新のために、あなたは、このレコードに操作2を変更することはできません完了したトランザクションが終了するまで待つ必要現在、あなたは失われた更新を回避することができます。

オプティミスティック・ロック

データベースレベルでのロックロック楽観的ではない、手動ロックを追加して、ユーザーが必要です。一般的に、我々は、ユーザーテーブルを更新する際に、このような操作を1と操作2を達成するために、データベーステーブル内のバージョンフィールドのバージョンを追加し、次のように文を実行します。

アップデートAは、名前=リージ、バージョン=バージョン+ 1 ID =#{ID}とバージョン=#{バージョン}を設定します

この時点では、更新を失うことを避けることができます。

ロックギャップGAP

我々は、データを取得するために使用された場合、記録、既存のデータのインデックスエントリロックは、データを取得するために、むしろ等しい条件以外の条件の範囲で、かつ要求が共有または排他ロック、InnoDBは条件の範囲を満たしています。キーのが、条件の範囲内に存在しません呼ばれるレコードを、 "ギャップ(GAP)。" InnoDBは、このロック機構は、いわゆるギャップロックこの「ギャップ」ロックであるだろう。例:EMPテーブルのみEMPID値1,2である101を、記録する場合、...、100、101

更新のためのEMPID> 100 EMPから*選択します。

上記範囲クエリで、InnoDBは101 EMPIDが記録されているロックの要件を満たすだけでなく、101もEMPIDうより大きい(これらのレコードが存在しない)、「ギャップ」ロックであります

ギャップを使用してInnoDBのロック・オブジェクトが2つです。

  • ファントムリードを防ぐために(私は、分離レベル反復は、ロックがGAPファントムリードすることによって回避することができる読み取り、上記述べました)

  • ミート回復や複製の必要性:トランザクションの前に必要なMySQLの回復メカニズムがコミットされていない、他の同時トランザクションことはできませんマジック読書許可されていないロックの条件を満たしているすべてのレコードの挿入

デッドロック

問題は、デッドロックによって複雑にされ、最終的に、それは、MySQLで問題をデッドロックします

ロックの概要

実際には、表ロック、我々はあまりそのプログラマーを懸念しています:

  • MyISAMストレージエンジンでは、SQL文を実行するときには自動的に追加されます。

  • あなたは、インデックスを使用しない場合はInnoDBストレージエンジンでは、表ロックが自動的に追加されます。

今、私たちのほとんどは、MySQLの使用InnoDBは、InnoDBの行ロックのサポートを使用しています:

  • 共有ロック - ロック読み取りロック-S-

  • 排他ロック - 書き込みロックロック-X-

デフォルトの場合は、任意のロックせずに行を選択 - トランザクションを記録するために、共有ロックまたは次の文で表示される排他ロックを設定することができます。

  • 共享锁(S):TABLE_NAME ... LOCKを共有MODE SELECT * FROM

  • 排他锁(X):TABLE_NAME FROM ... UPDATE FOR SELECT *

また、InnoDBの行ロック実装MVCCマルチバージョン同時実行制御に基づいて、読み取り下MVCC作業がコミットと反復は、分離レベルで読み出します。ブロックせずに読み書きを達成するためにMVCC

 

これらは、記事の内容全体あり、学び、友人の交換経験がSwoole交換グループ学習に参加して、交換する必要があり、我々は一緒に学び、交流に問題がある、一緒に進行!あなたが技術を学んでいることを条件とします。読んでくれてありがとう!

グループに参加するにはここをクリック

 

おすすめ

転載: www.cnblogs.com/heyue0117/p/11911602.html