Javaのアーキテクチャの道 - (mysqlの基礎となる原則)MySQLのトランザクション分離とMVCC

  我々は、MySQLの基本構造について、一般的に話をしたいくつかのブログで、どのようなB +ツリー、どのようなハッシュはああ返す必要があり、以降のMySQLの最適化について話しましたEXPLAIN、私たちは、MySQLのロックを言うのこの時間。

MySQLのロック

  性能ロックから楽観的ロック(バージョンで実装するために比較されたい)と悲観的ロックは、楽観的ロックは、高性能より悲観的ロック。

  データベース操作のサブタイプからの(全てが属する読み取りおよび書き込みロックに分割されている悲観的ロック

  ロック(共有ロック)を読む:同じデータのために、複数の読み取り操作が同時にお互いに影響を与えずに行うことができます。読み取り専用で書き込みができない、ロック以外のスレッド。

  ロック(排他ロック)を書く:それは他の書き込みロックをブロックし、ロックを読まれる前に、現在の書き込み操作が完了していません。ロック・スレッドのほかに何もすることができません。

  副操作データのサイズがテーブルと行ロックに分割されているから、そして稀に述べられていないギャップをロックします。

私たちは、主のためのテーブルと行ロック、そして私たちのギャップロック。

注意:悲観的ロックを待つために、ほとんどのロックがあります。

テーブルロック 

  名前が示すように、プラステーブルロックは、テーブル全体をロックします。オーバーヘッドは、それがデッドロックではないだろう、すぐにロックされ、小型であり、大きな粒子サイズ、ロックの競合、同時実行の最低度の最も高い確率をロックします。

のは、いくつかのコマンドを見てみましょう。学生と例えば表、

テーブルロックを追加します、ロックテーブル名テーブルの読み込み(書き込み)テーブル名を2読み取り(書き込み)。

テーブルの学生の書き込みをロックします。

ビューテーブルの状態(ロックされているかどうか):

オープンテーブルを表示します。

IN_USEが既に存在であるロックを持っているとして、があります。

テーブルのロックを解除:テーブルのロックを解除します。

テーブルのロックを解除します。

(SELECT)のクエリを実行する前にMyISAMテーブルは、自動的に関連するすべてのテーブルの読み取りロックに追加されます
CRUD操作を実行する前に、自動的に関連するテーブルの書き込みロックに追加されます。
図1は、MyISAMテーブルを読み出す(プラスロック読み取り)、同じテーブルの他のプロセス冷読み取り要求をブロックしていないが、同じテーブルへの書き込み要求をブロックすることができます。唯一のロックが解除されて読んだ後、それは他のプロセスの書き込み操作を実行します。
図2は、MylSAMテーブルは、書き込み、読み取りおよび書き込み操作が他のプロセスによって実行されるとき、ロックのみが解除され、他のプロセスが同じテーブル上で操作を読み書きブロックする、(書き込みロック)を書き込みます
3、MylSAMテーブルは、トランザクションをサポートしていない、行ロックをサポートしていません。

行ロック

  各動作のためにデータの行をロックします。大きなオーバーヘッドが、低速ロック、ロック競合、同時実行の最高度の最小サイズと最小確率をロック、デッドロックが存在することになります。

我々はACIDを言及する必要があり、そして我々はそれを確認する必要があると述べました。

(アトミック)原子性:

そのようなBへ転送Aとして、そのトランザクションのすべての一切行って、そうでないかのどちらか、ケースの一部だけが表示されないが、Aは、あまりお金を表示されない、お金がBの場合には増加していない、どちらかのすべてが成功しますかすべては(ロールバック)に失敗しました。アクションのこのシリーズは、アトムとみなすことができます。

C(一貫性)一貫性:

ある状態から別の状態へのトランザクションを意味するAだけ増加することができない100、B 30を縮小したものと同じです。

I(アイソレーション)アイソレーション:

それは修正されていない完全なデータの提出時に取引され、他のトランザクションは表示されません。もちろん、ここでの分離レベルの概念があり、異なる分離レベルで、さまざまな症状があるでしょう。

D(耐久性)永続性:

トランザクションがコミットされると、変更を永続的データベースに保存されますようにします。

そして、最初にどのような影響の上に移動します同時トランザクションによって引き起こされる私たちの問題は、あります。

  更新損失(ロスト更新)

二つ以上のトランザクションが同じ行を選択し、各トランザクションは、他の事項の存在を知らないので、その後、行を更新するために、初期値に基づいて選択、失われた更新の問題が発生した場合 - 最後の更新は、その他の事項でカバー作られたアップデート。

例:たとえば、私たちは10枚の以上のチケットへのクエリは、バーを販売しながら、我々は、我々はスレッドBを開いて、スレッドAのトランザクションを開いて、2つのスレッドが同時に小さなものをチケットに行くと売って開かれました。1、10-1、および残りの9を販売し、我々はまた、10-1であり、残りの9スレッドBの作品を販売し、Aを提出し、Bは、我々は明らかに2枚のチケットを販売し、提出したが、結果のデータベース9確かに、唯一のチケットを販売しています。

  ダーティリード(ダーティリード)

トランザクションは、トランザクションが完了する前に、レコードを変更するために行われ、一貫性のない状態で、このレコードに、データを提出している。この時間は、別のトランザクションが同じレコードを読み取る、制御されない場合には、第二トランザクションは、これらの「ダーティ」データを読み込み、それに応じて更なる処理のために、それがコミットされていないデータの依存関係を持つことになります。この現象はイメージと呼ばれる「ダーティリード。」ボトムライン:トランザクションBへの読み出しトランザクションが変更されているが、まだコミットし、操作はまだこのデータに基づいて行われていません。トランザクションがBをロールバックされた場合は、この時点では、読み出しデータが無効である、一貫性の要件を満たしていません。

  再読み込みすることはできません(非反復読み込み)

データの一部を読んだ後、いくつかの時点での取引、再び以前の読み出しデータを読み、彼らは、読み出したデータが変更された、またはレコードの一部が削除されました!この現象は "と呼ばれていることがわかりました非反復可能読み取り。 " ボトムライン:Bが孤立に準拠していない提出されたデータトランザクションを変更するための読み出しトランザクション。

  マジック読書(ファントム読み込み)

トランザクションが前に見た同じクエリのデータ検索に再読み込みが、そのクエリを満たすために新しいデータを挿入するから、他のトランザクションを見つけた、と呼ばれる現象は、「ファントムをお読みください。」ボトムライン:トランザクションが提出した新しいBへのデータトランザクションを読み込むには、アイソレーションに準拠していません。

その背後に2つのMVCCメカニズムを持つことは、一時的にここに置かれ、それが起こる方法を知っています。

これらの問題は、我々は戻って私達のデータベースを右へ行きます。

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

  

一般的に読書を繰り返すように設定します。より厳格な、小さな同時副作用のデータベースのトランザクション分離が、コストの大きい、トランザクション分離は、本質的にある程度の取引であるため、「シリアル化された」「同時性」とは矛盾している明らかにしている、で。同時に、分離トランザクションの要件の読み取り一貫性と学位のためのさまざまなアプリケーションには、多くのアプリケーションとして、異なっています

 「非反復可能読み取り」とするために、データへの同時アクセスの能力の方が重要であってもよいし、小文字を区別しない「幻読み」。多くの場合、現在のデータベースのトランザクション分離レベルを参照してください:「tx_isolation」のようなショーの変数、配置されたトランザクション分離レベル:設定tx_isolation =「REPEATABLE-READ」;

 残りは、コミットされていないREAD UNCOMMITTED-読み、しようとSERIALIZABLEコミットREAD-COMMITTED、シリアライズを読むために行くことができます。

MVCC:

  この超重要なのは、上記のほとんどすべてを知っていることを理解する〜!

英語を中国語に翻訳マルチバージョン同時実行制御、つまりマルチバージョン同時実行制御と呼ばれます。概念は抽象的で、私たちはどのような彼の制御はいわかりません。

それが私たちのMySQLのテーブルには、トランザクションIDのオープンと呼ばれる2つの仮想フィールドを持っていることを前提と栗が、あるために、自動インクリメントされ、削除トランザクションIDと呼ばれます。トランザクションは、トランザクションID番号を開いて与え、最初のSQLの実装に任意の値を与えることはありません再オープンすると、我々はゼロと仮定が、トランザクションID(または空)を提出与えるものではありません。学生テーブルには、私たちは、地図上の話をする例を与えます。

 

 

 簡単に言えば意味マップ、毎回私たちは、SQLを実行すると、クエリのSQL場合は、このバージョンでは、私たちのcreateIDフィールドを更新する、タイムスタンプ付きのスナップショットのバージョン番号を生成します、我々はCRUD操作の意志についてDeleteIdはフィールドへの更新のバージョン番号は、各トランザクション間のスレッドのバージョン番号は独立しており、私たちの次の問い合わせのために、我々はデータをチェックするよりも大きいか、当社のスナップショットのバージョン番号に等しいcreateID、そして私たちの電流未満をDeleteIdはIDのデータのスナップショットバージョン。MVCCは、一般的に反復可能読み取り分離レベルですが、また、提出され裁判を読んインチ 不利な点は、MVCCは、冗長スペースで、その結果、スナップショットの複数のバージョンを保存しますが、各スレッドの独立した動作を保証することです。

ロックギャップ

簡単に言えば、ギャップはロックについて、私たちのテーブルIDがインクリメントされている場合、我々は開いているトランザクションを書き、我々は修正SQLを書きます

 学生セット名= '1111'に更新  ID> 8とid <22。

換言すれば、もしデータID 8〜22、最大IDの全てが、この禁止の範囲をロックダウン、この範囲の最小のIDを超える22、8未満であるかどうか追加し、残りを変更することです位置が可能です。あなたのテーブル構造を参照してください。

たとえば、あなたのテーブルがあります

 SQLは、名前=学生アップデート「1111」SETれる  。ID> ID 8と<22;実際には、我々は、範囲をロック(22から6)が区間レンジ動作を開けていないです。

 ロックアップグレード:

   我々は努力の背後にある条件はインデックスフィールドを維持するためにどこが更新または削除するときに内部ロックは、つまり、インデックスに追加されているのInnoDB。

ロック分析: 

  私たちは、「%like'innodb_row_lockステータスを表示することができます。私たちは、ラインロックを表示するコマンドを競います。

彼らは、次のように表現されています

Innodb_row_lock_current_waits:ロックの数が現在待機

Innodb_row_lock_time:システムからの起動今の時間の長さの合計にロックされている(全体の長さを待っています)

Innodb_row_lock_time_avg:平均時間は待って過ごしたすべての時間(平均期間を待っています)

Innodb_row_lock_time_max:費やした時間を待っている最長のシステムから現在に開始

Innodb_row_lock_waits:システムが待っているの今総に起動した回数(総数を待っています) 

デッドロック

これは、相互のロック待ちのデッドロックです。

自動的にデッドロックを検出し、デッドロックが発生したトランザクションをロールバックすることができますmysqlのほとんどの場合に、いくつかのケースでは、自動的にデッドロックのMySQLを検出することはできません。ショーエンジンInnoDBのステータスの\ G:最近のデッドロックのログ情報を参照してください。

概要

可能な限りすべてのデータを取得するには、表ロック、合理的な設計指標に何のロック・エスカレーションを避けるためないために、インデックス、インデックスラインによって行われます。

ギャップはロックを避けるために、検索条件として範囲を減らすために、ロックの範囲を最小限に抑えます。

トランザクションのサイズ、リソースの量を制御し、時間の長さのロックを削減しようとすると、SQLを含む取引をロック

最後のトランザクションの実行を置くようにしてください

できるだけ低いトランザクション分離レベル

  

おすすめ

転載: www.cnblogs.com/cxiaocai/p/11594151.html
おすすめ