物事分離レベル、MVCCと共通データベースのロック導入

取引の基本的な要素(ACID)

  1は、アトミック(原子性):トランザクションの開始後にすべての操作、どちらかのすべてが行われ、またはすべてがそうしていない、中央部で立ち往生することはできません。エラーがトランザクションの実行中に発生し、トランザクションの開始前の状態にロールバックされます、すべての操作は次のように起こったことはありません。そのトランザクションは、これまでに原子高校の化学のように、不可分の全体である物質の基本単位です。

   2.一貫性(一貫性):最初とトランザクションの終わりには、データベースの整合性制約は、前に破損していません。例えば、Aがお金を控除することはできませんBへの転送は、Bは受信しませんでした。

   図3に示すように、分離(単離):異なるトランザクション間で互いに干渉することなく同時に、同じデータのための唯一のトランザクション要求、。例えば、Aは、Bがカードにお金を転送することはできません、銀行カードからお金を引き出すプロセスAの終了前にお金を引き出すことです。

   4、永続的には、(耐久性):トランザクションの完了後、データベースに対するすべての更新がデータベースに保存されますトランザクションはロールバックすることはできません。

原子、永続はREDOログによって達成される(REDOログ)、ログがトランザクションの一貫性を確保するために使用されて元に戻します。

問題が発生しやすい環境の同時

1の損失変更
T1およびT2を、続いて変性T1、T2を変更するために、データを変更するトランザクションの2つである、T2変化は、修正さT1を覆います。

2.ダーティデータ読み込み
T1にデータ変更を、T2は、このデータを読み取ります。この改正は、T1を取り消された場合、T2は、データがダーティデータで読み込みます。

3.非反復読み出し
T1データが修正された、T2リードデータを。T2は再びデータを読み込む場合は、結果と最初の読み取りの結果を読んで、この時間は異なります。

注:ダーティリードコミットされていないデータ、非再現性は、データが送信されたことを反復不能読み取りや汚れの区別を読む続きを読むれます。

前記ファントムが読み取ら
T1は、範囲内のデータを読み出し、T2は再びデータを読み取るために、この範囲T1、この範囲内の新しいデータを挿入し、その結果、この時点で読み、最初の結果が異なる読み取ります。

標準SQLにおける分離の4つのレベルを定義し、各レベルは、トランザクション内および表示されないトランザクションの間に表示されているトランザクションで行われたすべての変更を提供します。低い分離レベルは、一般に、より低いシステムのオーバーヘッドをより複雑に実行することができます。

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

1.非コミット読み取り(READ UNCOMMITTED)
修飾トランザクションは、提出されていない場合であっても、また、ダーティ・リードの発生につながる他のトランザクションに見えます。これは、同時実行の分離レベルの最低レベルで、問題への同時がちの大きな数字は、実際のビジネスシナリオはほとんど使用することはありません。

コミット2.読む(COMMITTED READ)
取引を行うために企業は、すでに提出を読むことができます。言い換えれば、前に他のトランザクションの提出に作られた会社の変更が表示されていない、この時点で、我々はこの分離レベルは、トランザクションの私達の定義の上に達成されている見つけることができるようになります!これらのその他の事項が改訂されたトランザクションTを提出した場合は、提出されたことは、効果的に読み込み、汚れの問題を解決することができますが、この期間中に提出する最初からトランザクションT場合は、他の多くの問題があるかもしれないことは注目に値します非反復可能読み取りの問題につながることができます使用されるデータは、発生します。

3.反復可能読み取り(REPEATABLE READ)
同じトランザクションで同じデータを複数回読み取る同じ結果を確認します。これは、ダーティリードの問題を解決するだけでなく、非反復読み込みの問題を解決します。
ただし、反復可能読み取り分離レベルダウン、唯一の同じ読み出しデータが同じであることを確実にするが、読書の範囲は、まだファントムの存在は読んでください!

4.シリアライズ(SERIALIZABLE)
これは、ペシミスティック並行戦略は、それは、読み込まれたデータの各行をロックしているだろう、それはタイムアウトとロック競合の多くの問題を引き起こす可能性の手段の中で最も暴力的ですトランザクションがシリアル化された実行されているので、しかし、その後、何の並行性の問題はありません。実用的なアプリケーションはめったにその中で非常に同時せずにデータの一貫性と許容性を確保する必要がある以外、この分離レベルを使用しない、この分離レベルを使用して検討します。

 

 トランザクション分離がある例は

なぜ長いトランザクションを使用しません

そこにこれらの取引は、データベース内のデータにアクセスすることがありますから、事務の非常に古いビューとなりますので、トランザクションがコミットする前に、すべてのレコードを保持しなければならないロールバックするために使用されるかもしれないデータベースにつながるであろうことを意味し、長いトランザクションシステム収納スペースの多くを取ります。

MySQLの5.5および以前のバージョンでは、長いトランザクションの最終提出は、ロールバック・セグメントを清掃する場合でも、ログは、データ・ディクショナリのibdataファイルと一緒に置かれているロールバックすると、ファイルが小さくならない、著者は、唯一の20ギガバイトのデータを見て、としていますそこに200ギガバイトのライブラリは、ロールバック、そして最終的にライブラリを再構築し、ロールバック・セグメントをクリーンアップする必要がありました。

ロールバックの影響に加えて、だけでなく、ロックリソースを保持している長いトランザクションは、それがライブラリ全体を下にドラッグでき

各種データベースのロック

注意:レコードロックロックインデックスをレコードで、むしろ、レコードそのものよりも。テーブルはインデックスが設定されていない場合、InnoDBは自動的に主キーに隠されたクラスタ化インデックスを作成しますので、あなたはまだレコードロックを使用することができます。

MVCCの例

一部のデータは、実際には3つの増加各行MVCCの終わりに、3列目は、実際に隠されたIDは、他のアクションであることを示し

 

 参考リンク:

【1】https://www.cnblogs.com/shihaiming/p/11044740.html

【2】CYC

[3]なぜ長いトランザクションを使用しないhttps://blog.csdn.net/xcy1193068639/article/details/85058641

【4】https://blog.csdn.net/u013568373/article/details/90550416

おすすめ

転載: www.cnblogs.com/lalalatianlalu/p/11568790.html