異常とデータベース分離レベル

アウトライン

コア機能がサポート取引で保存するために、他のデータベースソフトウェアと比較すると、いわゆるACIDトランザクションは、原子性、一貫性、独立性と耐久性です。これは原子性、一貫性、永続性がより例えば、単一のトランザクション自体を懸念しているが、アトミックトランザクションがいずれかのコミットまたは提出されていない運用要件、一貫性に必要な操作を含む制約が定義されて満たさなければならないトランザクション内のフリップフロップ、外部キー制約は、トランザクションが正常に送信された場合に持続性は、トランザクションが失われないことを保証しなければならない、何も異常はなど、プロセスのクラッシュ、ホストパワーダウン、を含む、発生したかどうか、必要とされます。アイソレーションは、懸念が複数のトランザクションの間に同時です。

 すべてのトランザクションが直列互いに独立の位相実行される場合、分離レベルの問題は存在しないであろう。しかし、シリアル複数のトランザクションの同時実行を必要とする、マルチコアの利点を十分に発揮することができない、と同時実行の等価直列実行とビジネスを行うには「をしてみてください」。なぜ「試します」か?データベースは、実際にはこれだけのデータベースの分離レベルを議論する必要がある1つの分離レベル、シリアライズ、だけではありませんので。缶シリアライズが最も厳しい分離レベル、平均事業間の紛争の最も高い確率で4種類、分離レベルを含め、例えばMySQLを取り、コミットされていない読んで、コミット読み、反復可能読み取り、およびシリアル化。理論的には、唯一の「連載」トランザクション・シーケンスが「正しい」、しかし、パフォーマンス向上のためのデータベースシステムを追求する必要性のために、より高いシステム・スループットで、システムが孤立して、追加の「弱い」を定義しますレベル。「弱い」の分離レベルが定義されている各、それが生成されます明確にどのような「異常」について説明するユーザーが許容できるならば、これらの「異常」は、まあ、我々は、最も深刻な同時実行制御モードにデータベースを設定しないでください。だから、要するに、分離レベルの設定により、ユーザーが「異常」と、データベースのパフォーマンスとのトレードオフを行うことができます。

データベースの異常

この記事は主紙から隔離のレベルを説明ANSI SQL分離レベルのA批判、紙は、「異常」のセットを定義し、そして分離した異なる孤立レベル記述する「例外」を [n]はW以下の説明は、R [n]は、トランザクションを読み取るnは、nは書き込みトランザクションを示すにおいて、[N]は、N-アボートトランザクションを表し、C [n]はn型コミットトランザクションを表します。A0、P1、P2、P3、 A4、A5 、および他の異常な番号が紙から命名されています。

1.汚い書き込み

A0、汚いライト(WW)、脏写

アクセスモード:W1 [X]、W2 [x]は、C1、C2

2つのトランザクションが書かれたXを持っている、これはW1 W2の書き込みでカバー取引につながります。

2.ダーティリード

P1、ダーティ・リード(WR)、ダーティ・リード

アクセスモード:W1 [X]、R [x]は、A1、C2

2×トランザクション値を読み、トランザクションアボート最終1は、xの値は、単に存在してはなりません。

そして、P1は区別READ UNCOMMITTED READ COMMITTED分離レベルであります

3.非反復可能読み取り

P2、反復不能読み取り【ファジィ読みます】

アクセスモード、R1 [X]、W2 [X]、W2 [コミット]、R1 [X]

トランザクションR1 2回の訪問のX、返される結果は同じではありません。例えばX = 10、

R1 [X = 10]、W2(X = 50)、W2 [コミット]、R1 [X = 50]

二つは、トランザクションR1 xを読んで異なる値を読み取ります。

そして、P2 ReadCommittedにRepeatableRead分離レベルを区別するため。

4.マジック読書

P3、ファントム

例外:同一トランザクション二回返された結果セットを読みは同じではありません、

ここでの主なポイントは、そのファントム読み取りで、ファントムは、トランザクション内の任意のクエリは、更新他のトランザクション(INSERT、UPDATE、DELETE)によって影響されないことを必要条件よりも厳しい非反復可能読み取りを読み出し、矛盾した結果の現象。そのX>ときクエリ再び見出され、この時点で、別のトランザクション挿入X = 6であり、例えば、最初のクエリは、x> 1は、3つのレコード(3,4,5)を返さここ...選択します1つのリターン(3,4,5,6)の4つのレコードが、これはファントムリード現象の一種です。

反復可能読み取りと直列化を区別するためのP3。

P1 - P3は、従来の分離レベルの異常を区別定義され、読み取りコミット、反復可能読み取りシリアライゼーションです。しかし、このポイントシステムの異常としては、特に一般的な普及MVCCの同時実行制御のために、十分かつ完全な説明でなくてもよいので、「異常」に基づいて、標準的な分離レベルの論文は、より豊かに定義され、現在のスナップショットの詳細を-Isolation。

5.Lost更新(上書き)

A4、ロストアップデート

A4アクセスモードR1 [X]、W2 [X]、W2 [コミット]、W1 [x]は、W1 [コミット]

このアクセスモードでは、W2の更新が失われることがあります。W1は、更新を行うには比較に基づくことができるので、古い-X X。

6.Read&書き込みスキュー

A5、(制約違反)は、アカウントにX、Yに関連する2つのレコードをとるX + Y = 100を満たす、読者は、によって、2つのに分けることができます

A5A、読むスキュー

R1 [X] ... W2 [X] ... W2 [Y] ... C2 ... R1 [Y] ...(C1またはA1)

読み取りトランザクションXの後、トランザクションはまた、その後2、X、Yおよびコミット、再読み込みトランザクションyを更新しました。

X = 50、Y = 50

R1 [X = 50] ... W2 [X = 20] ... W2 [Y = 80] ... C2 ... R1 [Y = 80] ...(C1またはA1)

トランザクション1、X + Y = 130

A5B、書き込みスキュー(書き込み前に読んで)

A5B:R [X] ... R2 [Y] ... W1 [Y] ... W2 [X] ...(C1及び発生C2)

C(x、y)は满足X + Y> = 0、X = 10、Y = 0

R1 [X = 10、Y = 0]、R [X = 10、Y = 0]、W1 [Y = -10]、W2 [X = 0]が、W1は(コミット)、W2(コミット)

最終結果は、X = 0、Y = -10であり、リード線は、X + Y> = 0の制約を満たしていません

データベースの分離レベル

私たちは、同時実行制御の話、実際には、分離レベルについて話しています。通常、データベースの同時実行制御ペシミスティック並行性制御ロック(2PL)とオプティミスティック並行性制御(OCC)に基づいて、2つのカテゴリが存在します。ロックの動作中に、元のデータは、トランザクションのコミットまでのみリリース。これは読み取り時にロックを解除し、トランザクションの書き込みが、トランザクションの提出時の動作の比較により及びwriteset readsetをコミットするかどうかを判断するために、競合があるかどうかを判断しています。オリジナルロックベースペシミスティック並行性制御、読み取りおよび書き込みがロックされ、並行性が比較的低いので、現在の主流のデータベースシステムは、冗長履歴を、単に、マルチバージョン同時実行制御(MVCC)、いわゆるMVCCを導入しましたバージョンは、ロックされていない読み取るために、読み書きの目的は、この読み取り値が現在の読み取りロックモードとは別の読書のスナップショットであり、相互に排他的ではありません。あなたがシリアライズ可能な分離レベルを達成する必要がある場合は大幅に提出した改善されたことをデータベースシステムの同時実行性の程度は、もちろん、あなたは確実にするために余分な作業を行う必要があります。以下は、それぞれ、主要なデータベースの簡単な例外を有する異なる分離レベル、での議論、および実装です。

1.READ UNCOMMITTED

読み取りと書き込みがロックされていない、完全なデータベースの同時実行制御、基本的にはノー実用的な価値をしません。

2.READ COMMITTED

レコードのロックを書かれ、読まベースのスナップショットを読み取り、各ステートメントは、別個のトランザクションのスナップショットを持って、最新のトランザクションが読み込みが、問題反復可能読み取りを解決していない汚れの問題を解決するために尽力して読んでください、もちろん、ファントム読み取りを回避することはできません、ReadSkew&WriteSkew他の問題。

3.REPEATABLE READ

彼は、スナップショット分離レベルが、実際の実装および基づいていますSNAPSHOTが行う一般的な主流のデータベースはもちろんのこと、SNAPSHOTを言及する必要がありますが、ここではいくつかの微妙な違いがあり、REPEATABLE READ分離レベルを述べました。しかし、書き込み時の電流の使用;のMySQL(InnoDBの)のために、まだ読んで読み出すときはREAD-COMMITED分離レベルに対してスナップショットは、ファントムが存在しない問題を読んで、反復可能読み取りを保証するために、トランザクションのスナップショットでありますそれはLostUpdate問題を引き起こす可能性がありのでスナップショットはもはや、と考えられるが、アップデートの最新バージョンに基づいてされたときに更新されていない、読みました。もちろん、解決策は、それがLostUpdate問題を回避して、読み取りにもを使用し、現在のトランザクションで読み、簡単です。ここでの例である:と仮定tは在庫表で、PK = 'iPhoneの主キー減算iPhoneは株式を売却され、カウント=カウント-1;書き込み用の2つの方法があると仮定

ケース1:

開始:
選択VAR =トンから数えるどこPK = 'iphone';
VAR = VAR - 1。
更新回数= VARトンからPK = 'iphone';
コミット;

ケース2:
開始:
更新カウント=カウント- 1トンからどこPK = 'iphone';
コミット;

ケース1の場合、トランザクションの同時実行の同じタイプの2つは、スナップショットは古いのカウントに読まれている場合LostUpdateは、想像して発生し、カバーする問題への書き込みは、在庫の削減、その結果、発生する可能性があります。
ケース2の場合は、次のシーンを更新し、LostUpdateに問題がないだろう、現在の読み取りは、RR分離レベルで、読んでいる、プラス書き込みロックは、最新のカウントを読むことができるようになります。

4.SERIALIZABLE

厳しい分離レベルは、自然に全く「異常」、我々が述べたように、システムの並行性を提供するために、データベースの分離レベルを低下させることによって選択された、であるが、一部の許容する必要がありません「異常」を 直列化は汚いが、読み取り/書き込み、失われたアップデート、ファントム読み取り、反復不能読み取り、およびReadSkew&WriteSkew他の問題解決します。MySQLの(InnoDBが)、シリアライズを達成する(GAP、ネクストキー、InsertIntention)ロックを現在のすべての読み取りへのすべての変更で読み取ると組み合わされて、PGは、他のトランザクションのwritesetかどうかreadsetとチェックに基づいて、トランザクションがコミットされますリングへの書き込みの間に存在し、依存関係、トランザクションコミットするかどうか、最終的な決意。MySQLの(Rocksdb)のみRCとRRをサポートしていますが、直列化分離レベルをサポートしていません。紙から次の図は、一緒に例外を対応する異なる分離レベルを置きます。         

 

概要

この論文では、と主流のデータベースシステムは、データベースの分離レベルを論じました。一般的には、生産環境はReadCommitの過半数を設定して、分離レベルの下に提出されたにも言及した記事では、非反復可能読み取り、ファントム読み取り、および読み取り/書き込みスキューやその他の問題があります読んで存在します。説明、本番環境では、これらの「異常」を「許容」することができます。もちろん、これは分離レベルは重要ではありません説明していない、特定のビジネスシナリオ場合は、コードを書くの業務が正しくない場合、それは問題を引き起こす可能性があり、私は記事で言及した在庫の削減にそのような例として、「異常」容認することはできません。要するに、我々は正しい前提のビジネスは最高のパフォーマンスを得る確保し、トレードオフのシステムの並行性と分離レベルで実行する必要があります。

おすすめ

転載: www.linuxidc.com/Linux/2019-11/161352.htm