トランザクションの4つの分離レベル
(:から引用 トランザクション分離レベルとロックInnoDBの関係)
データベース操作では、有効データの正しさを保証するために、同時に提案されたトランザクション分離レベルを読み取ります。当社のデータベースロックするだけでなく、これらの分離レベルが存在して構築すること。
分離レベル | ダーティリード(ダーティリード) | 非反復可能読み取り(反復不能読み取り) | マジック読書(ファントムリード) |
---|---|---|---|
非コミット読み取り(非コミット読み取り) | 可能 | 可能 | 可能 |
READ COMMITTED(読み取りコミット) | 不可能 | 可能 | 可能 |
反復可能読み取り(反復可能読み取り) | できないこと | できないこと | 可能 |
シリアライズ(直列化) | 不可能 | 不可能 | 不可能 |
データ汚れは、他のセッションの変更からコミットされていないトランザクションを読みすることが可能であることを、許可されている読み:非コミット読み取り(READ UNCOMMITTED)
コミット読み取り(読み取りコミット):あなたは、すでに提出されたデータを読み取ることができます。ほとんどのOracleや他のデータベースがデフォルトレベルである(ない反復可能読み取り)
反復可能読み取り(Readを繰り返し):読み取り、反復。トランザクションの同じトランザクションクエリ開始時間内では、InnoDBのデフォルトレベル一致しています。SQL標準では、分離レベルは非反復可能読み取りを排除しますが、ファントム読み取りがあります
シリアルリード(直列化)は:完全読み取りシリアライズ、各読み取りは、読み取りと書き込みがお互いをブロックする、共有テーブル・レベルのロックを取得する必要があります
反復可能読み取りとファントム読み取り
反復可能読み取り後、最初の読み出しSQLデータは、データがそれを繰り返し読み取りを実現することができ、他のトランザクションがこれらのデータを変更することはできません、(悲観的ロック)ロックします。しかし、この方法はとてもトランザクションAが以前にデータを読み込む、またはすべてのデータを変更すると、トランザクションBはまだデータ、トランザクションA INSERT提出することができ、あなたが前にいない不可解以上でしょう、データ挿入をロックすることはできません魔法を読み込まれたデータは、行ロックすることで回避することはできません。必要Serializableの分離レベル、読み取りロックで読み取り、書き込み、書き込みロック、読み書きロックミューテックス、そうすることが効果的に読み込み、ファントムを防ぐことができ、反復不能読み取り、汚れが読み込みやその他の問題が、大幅同時実行データベースを軽減します容量。
しかし、MySQLの、ORACLE、PostgreSQLと他の洗練されたデータベースは、パフォーマンス上の理由から、達成された楽観的ロックの理論的根拠とMVCC(マルチバージョン同時実行制御)を使用しています。
実際のテスト結果
AとBの試験に効果の状況は更新のために選択取るために、選択、更新文:同じDBインスタンスへの2つの接続を作成します。
更新行レベルのロックのために選択し、使用しないでください
提出します | B提出します | |
---|---|---|
最初のオープン・トランザクション | 更新のB含有量 | アップデートの内容 |
最初のオープン・トランザクション | 更新のB含有量 | アップデートの内容 |
結果は、その結果を反映提出最後の、あります
更新、更新行レベルのロックの第1の選択を使用して
更新のために選択し使用 | 更新のために選択し使用 | 使用更新 | |
---|---|---|---|
トランザクションを開いて、bが開きません | B内側ブロックされたアップデートや更新のための選択 | 影響を受けていないB | B内側ブロックされたアップデートや更新のための選択 |
オープンB、トランザクションを開けないでください | 影響を受けていないB | 影響を受けていないB | 影響を受けていないB |
、Bオープン情勢 | B内側ブロックされたアップデートや更新のための選択 | 影響を受けていないB | B内側ブロックされたアップデートや更新のための選択 |
A、B、総務は開きません | 影響を受けていないB | 影響を受けていないB | 影響を受けていないB |
結果は、使用更新と更新原因閉塞効果のために他の接続された選択へのデータ行レベルのロック、(選択に影響なし)を追加する更新を選択、開始使用して明示的なトランザクションを開いています。
ロック後に提出見直し、bがコンテンツを読みます
以下は、更新のための選択を使用して、その後、開いているトランザクションでは、更新のために選択/選択し、実行するUPDAT、最後にコミット使っB、効果はBのクエリの過程を通じて観察されました。
B使用アップデートを選択 | Bを選択し使用して | |
---|---|---|
オープン総務B | B内部の提出後に、ブロックされている更新のために選択し、bが読み取り内容の変更があります | bは閉塞ではないが、Bの内容を読み取ることはまだ開い業務であります |
B総務は開きません。 | B内部の提出後に、ブロックされている更新のために選択し、bが読み取り内容の変更があります | Bブロックから、提出されたデータの変化を読んだ後に |
接続は、トランザクションを開始し、更新を選択し、接続bのブロッキング効果の更新を使用してオープンした後
最初の実行の更新を選択 | 最初の実装のアップデート | |
---|---|---|
セレクトBを実行した後 | ブロックされていません | ブロックされていません |
B実行後にアップデートを選択 | おもり | おもり |
実行更新bの後 | おもり | おもり |