記事のディレクトリ
MySQLデータベースのロック
データベースのロック分類
- ロック粒度で割ったテーブル・レベル・ロック、行レベルロック、ページレベルのロックに分割することができます
- ロックレベルをクリックして、共有ロックに分けることができ、排他ロック
- 方法をロックすることにより、自動ロックに分けることができ、ディスプレイをロック
- 動作モードがDMLロック、DDLロック(DMLステートメントの追加がロックに対応する調査のこのタイプ、および構造DDLロックのこのタイプの動作の変化)に分けることができるプレス
- 使用することで楽観的ロックに分けることができ、悲観的ロック
オプティミスティック・ロック:常に最良のケースを想定して、データが変更されていないと思う他の人をピックアップしているたびに、それはロックされませんが、更新はこの時間の間にどのような他人を判断する時期のデータを更新するために行きませんでした、あなたは、バージョン番号のCASメカニズムとアルゴリズムを使用することができます。マルチ読書シーンのために。
悲観的ロック:人は、このデータを取りたいので、彼女はデータを取ったたびに、ロックされますので、常に、データは他の人がすると思うの変更時間を取得し、最悪のケースを想定し、それを得るためにロックされるまでブロックされます(スレッドに時間を使用して共有リソースは、他のスレッドがブロックされ、その後、他のスレッドへのリソースの転送を実行しています)。伝統的なリレーショナルデータベース内のこのロック機構の多くを使用するために、行等ロック、テーブルロック、リードロック、ライトロックのように、第1の動作を実行する前にロックされています。ジャワの実装は、同期とReentrantLockの中や他の排他ロックは、ペシミスティック・ロック・思想です。シーンを書くために適用します。
ロックの側面上のMyISAMとInnoDBの違い
デフォルトのMyISAMテーブルレベルのロックが使用され、それがサポート行レベルはロックしない
InnoDBのデフォルト行レベルのロックを使用することであり、また、テーブルレベルのロックをサポート
MyISAMの中
- UPDATE場合SELECTは、テーブル・レベルは、この時点で、ロックを読み取る生成するときに読み取りロックが解除されるまで、DELETE、INSERTは、ブロックに、BLOCKであろう。
- 書き込みロックが解除されるまで同様に、UPDATE、INSERTは、DELETE、テーブル・レベルの書き込みロックを生成する場合、SELECTがブロックにブロックです。
表は、手動での読み取り/書き込みロックを増やします:
LOCK TABLES table_name read|write;
ロックを読む共有ロックを行う通常存在SELECT操作は、その後、既に進行中の同じテーブルにこの時点でSELECT操作であり、第二SELECT操作がブロックされていないが、場合ので、このロックをすることができSELECTはまた、共有ロックと呼ばれる2つの操作によって共有されています。それを回すために約しかし、ときに最初のSELECT文プラスFOR UPDATEの背中に、排他ロックので、SELECT操作があれば、この時点で、操作はブロックに分類されます
書き込みロック:すでに書き込みロックがある場合、より多くの書き込みロックまたは読み取りを設定する場合は、この時点では、それがブロックされた状態に陥ります。
InnoDBの
トランザクションのバッチ操作の内側にロックされる第一、およびコミットすると、次に、その後統一ロックを解除するロックを追加する:InnoDBは、ロックとロック解除を2つの段階に分割されていることを、二段階ロックを使用します
デフォルトは自動的にMySQLのInnoDBは、トランザクションに提出されているので、トランザクションが自動的に提出され、あなたが使用することができます閉じ
SET autocommit = 0;
SELECTでInooDBで明示的に読み取りロックを追加する必要が最適化されたSELECT文の後に共有モードでロックに追加する必要があります;のInnoDBロックはデフォルトの行レベルでサポートされています。
行レベルのロックを使用して索引に使用InnoDBは、テーブルレベルのロックを使用して、インデックスに使用されていないSQL、で
MySQLデータベースのデッドロック
デッドロックにMySQLは主にInnoDBストレージエンジンデッドロック話してMyISAMテーブルは、行レベルのロックをサポートしていません。
二つの方法でデッドロックを解決MYSQL:事業により、データベースを設定することにより、
ビジネスロジックによってデッドロックを解決するために、
- 指定されたロックの取得順序
- 個々の小さなトランザクションに大きな取引を破ります
- 同じトランザクションで、多くのリソースとしてのロックとデッドロックの可能性を減らします
- テーブルに適切なインデックスを確立し、トランザクション分離レベルを下げる、など
データベースを設定することにより、デッドロックを解決するために、
- タイムアウトパラメータは、InnoDBエンジンのデフォルトは50代で、実際のビジネスシナリオinnodb_lock_wait_timeoutに基づいて設定されています。
- デッドロックの検出を開始した後、我々は他のトランザクションが続行するように、デッドロック、トランザクションをロールバックするチェーンのイニシアチブでのデッドロックを発見しました。上へInnodb_deadlock_detectパラメータセットは、このロジック(状態ONデフォルト)に示します。
「それは、テーブル全体をロックする際に行レベルロック?」
InnoDBの行レベルのロックは、更新された列は、それがテーブル全体をロックする索引付けされていない場合は、インデックスレコードをロックすることによって達成されます。
ここでは、ネットオフ大きな収穫を牛に感謝します。
MyISAMテーブルとInnoDBのそれぞれのアプリケーションのシナリオ
- MyISAMテーブル:
- 頻繁にフル・テーブル・カウント・ステートメントを実行し、MyISAMテーブルは、テーブルの行数を保持する変数はこんなに早く、そこにあります
- データの効率性を確認するための追加や削除が高い、非常に頻繁にクエリではありません
- いいえ取引ん
- InnoDBは:
- 欠失を変更して再検索データ(行レベルのロックがテーブル・レベル・ロックによって理解することができる)かなり頻繁に
- 高い信頼性要件、必要なサポートサービス
MySQLのデータベーストランザクション
データベーストランザクションの4つの特徴
酸
- 原子性(Automic):トランザクションに含まれるすべての操作は、すべての実行またはすべてのロールバックに失敗のいずれか
- 一貫性(整合性):サービスが他の一貫した状態への遷移に1つの一貫した状態からデータベースの状態ことを確認すべきです。
- アイソレーション(分離):並行トランザクションを実行する複数のトランザクションが他のトランザクションの実行に影響を与えるべきではありません
- 永続性(耐久性):トランザクションがコミットされると、彼は永続的にデータベースに格納する必要があるデータベースに提出。
総務の問題、およびトランザクション分離メカニズムの同時アクセス
トランザクション分離レベル
- 非コミット読み取り(READ UNCOMMITTED):
ダーティリードを許可。トランザクションがデータの書き込みが開始された場合は、追加のデータを同時に書き込むことが許されますが、他のトランザクションがトリップデータを読み取ることができますされていません。
- READ COMMITTED(読み取りコミット):
またとない読み取り可能にダーティリード、しかしありません。読み出しデータトランザクションが他のトランザクションがデータの行へのアクセスを継続できますが、書き込みコミットされていないトランザクションが行にアクセスすることから、他のトランザクションを防ぐことができます。
- 反復可能読み取り(反復可能読み取り):
禁止されている非反復読み取りとダーティ・リード、時にはファントム読み取り表示されることがあります。読み出しデータトランザクションが書き込みトランザクション(ただし、読み取りトランザクションを可能にすること)によって禁止されて、書き込みトランザクションは、他の取引を禁止します。
- シリアライズ(直列化):
厳格なトランザクション分離を提供します。これは、トランザクションが同時にではなく、1で行うことができ、トランザクションのシリアル化が必要。
高いトランザクション分離レベルは、優れたデータの整合性と一貫性を確保するが、同時動作の影響は大きいです。MySQLのデフォルトのトランザクション分離レベルが反復可能読み取りです。
同時アクセスの問題トランザクションによって引き起こされるとどのように回避するために、
- 更新損失:同じデータしばらく二つの異なる取引、その後、彼らの問題に同時にデータを変更し、そのトランザクションが上書きされた後にトランザクションに更新を提出するように更新提出され、会社が行うには、このケースを提出しました更新は、更新を失ったデータが得られ、上書きされます。(MySQLはデータベースレベルのすべてのトランザクション分離レベルを回避することができます)
- 汚れが読み:トランザクションは、一貫性のないデータトランザクションAが得られ、バックBロールトランザクションので、コミットされていないデータトランザクションBを読み込み、結果はMySQLのInnoBD、避けるために、トランザクションの分離レベル以上のトランザクションAの汚れの読み取り(READ-COMMITEDが登場しましたデフォルトの分離レベルですREPEATABLE_READ)
分離レベルを設定します:
SET SESSION TRANSACTION ISOLATION LEVEL read uncommited;
- 非反復可能読み取り:操作によって、彼は、データベースのデータを更新しなかった場合、トランザクション、クエリまたはいくつかの場面で異なる数値結果では、2回行い、他のトランザクションがデータを更新するので、トランザクションを提出している(REPEATABLE_READトランザクション分離レベル以上回避)
- マジック読書:Nレコードを読むときにトランザクションが読み出され、トランザクションBは、トランザクションの過程で増加したが、Aで行われ、Aは、トランザクション時間を読んでN + 1のアイテムとなり、この状況は魔法と呼ばれています読み。(セットSERIALIZABLE分離レベルに幻覚のようなトランザクションAのルックスで、その結果、回避することができ、同様に、これは分離の最高レベルです)
非反復リードとファントムは区別を読み取る:構造変化の魔法読取手段は、例えば、数が変化;非反復可能読み取り値の読み取りが変更される手段。
次のように特定の集計データベースのレベルは、上記の問題を回避します。
トランザクション分離レベル | ロストアップデート | ダーティー読み取り | 非反復可能読み取り | マジック読書 |
---|---|---|---|---|
非コミット読み取り | 避けてください | 起こります | 起こります | 起こります |
コミット読取り | 避けてください | 避けてください | 起こります | 起こります |
反復可能読み取り | 避けてください | 避けてください | 避けてください | 起こります |
連載 | 避けてください | 避けてください | 避けてください | 避けてください |
パフォーマンス上の理由から、高いトランザクション分離レベルは、より高いセキュリティ、より深刻なシリアル化された実行は、これはデータベースの同時実行の程度を削減する、ビジネスに基づいてトランザクション分離レベルを設定する必要があります
二つの重要なログモジュールでのMySQLデータベース
使用中のMySQLのすべての更新操作は、対応する条件が発見されたに応じて記録されている場合は、更新操作は、非常に頻繁にあり、その後、レコードが更新され、その後、ディスクへの書き戻しは、その後、IOは、コストとコストの記録は非常に高くなります見つけます。だから、言っていること、ロギングモジュールがあった、私たちの更新更新操作が適切なタイミングで、ログを書くことです書き込みディスクになり、ログには、クライアントに結果の実装を更新されます。
ビンログ(アーカイブログ)
- ビンログには、すべてのエンジンを使用することができ、ログサーバ層であり、
- バイナリログは、本質的に白色のSQLステートメントであるステートメントの形式、「ボブ」、元の論理文を記録する論理ログは、= 1 UIDとしてデータに新しい値を割り当て、このラインであります
- ビンログは、次に切り替わり、以前のログを上書きしない追加の書き込み、ログファイルが特定のサイズに書かれています。
バイナリログログファイル形式(文、行、混合)
- ビンログ記録文の形式は、欠点も明らかにされている、完全なSQLステートメント、利点は小さなログファイルで、より優れたパフォーマンスで、精度不良であること、SQL文を検出など、今()関数があり、不正確につながることができます
- バイナリログ行フォーマットは欠点が大きいことをログ・ファイルであり、利点は、データレコードが正確であることで、データ線の変化の実際のデータを記録します。
- フロント両方の混合形式バイナリログ混合モード
多くの場合、精度の要件が最初にランクされているので、ほとんどのは、行のモデルを使用しています。
REDOログ(REDOログ)
- InnoDBエンジンは、独自のログモジュール、物理ログが変わるどのようなデータ・ページに記録されているREDOログ
- 4つのファイルのセットとして構成することができるような固定サイズのInnoDBの再実行ログは、各ファイルが1ギガバイトは、次いで、4GBの操作の合計を記録することができるログをやり直すあります。ゼロから書かれて、それが書き込みサイクルの最初にエンドバックに書き込まれます。
- InnoDB REDOログは、データベースの例外が失われることはありませんレコードを提出する前に、この能力はクラッシュセーフと呼ばれ、再起動後に発生することを確実にします。
SQLクエリが遅いチューニングや他のいくつかの些細な知識:SQL文のテクニックのいくつかを要約します次のMySQLの要約では、インタビューの高周波数ポイントがあります