トランザクションのMySQLの深い理解

データベーストランザクションの開発者が不慣れではないが、あなたはどのようにではなく、なぜ、その後、開発に必然的にコードにバグが存在する書き込みますを知っている必要がありますかのように、この記事の紹介は、トランザクションの分離レベルを強調するために業務をのmysql。

1. ACID

1.1不可分

トランザクションは、作業の不可分単位であることをアトミック手段は、トランザクション内のすべての操作は、いずれかの実行またはすべての実行されません。
例えば:
//オープン取引開始
A:ユーザー更新SET =アカウントアカウントID = + 1 1;
B:SET更新ユーザーアカウント=アカウントID = + 1 1 WHERE;
コミット
このトランザクションのコミットは、その内の2つのステートメントを実行します彼らは、エラーが、ロールバックの実装を発生した場合、二つの文を元の状態にロールバックされ、正常に実行されています。

アンドゥログ保証の原子
何らかの操作前のデータ、最初の場所にバックアップデータ(これは、ストアアンドゥログデータへの場所です)。そして、データを変更し、エラーが発生したりした場合にトランザクションの開始前に、ログのバックアップアンドゥシステムに利用可能なデータを使用して、ユーザー、ユーザーが実行するロールバックステートメントは、状態に復元されます。
注:アンドゥログは、論理ログがされる
として理解することができます。

  • レコードが削除すると、レコード内のアンドゥログレコードが挿入に対応します
  • レコードの挿入は、アンドゥログレコードは、対応するレコードを削除しますとき
  • 場合対向UDPATEに対応するレコードを記録する更新レコード、

    1.2一貫性

    トランザクションの実行とトランザクションの実行前と後に、データベースの整合性制約が破壊されません。即ち、トランザクションの実行が別のアクティブ状態に一つの活性状態から転送され、
    例えば:
    トムトランスファージャック50に、アカウントトムがジャック50に結合されていない、システム障害またはその他の理由から減少し、トランザクションが完了していない場合、全体の転送処理は、データの一貫性を確保するためにデータベースをロールバックします。

    1.3分離

    分離は、異なるトランザクションが互いに干渉しない同時トランザクションの各々を分離する必要があり、同時操作を指します。

    1.4 持久化

    トランザクションが正常に送信されると、すべてのトランザクションデータ操作は、データベースが再起動されたとき、いくつかのメカニズムによって、データの復旧を保証することができる必要があり、データベースがクラッシュし、トランザクションがコミットされた後であっても、データベースに永続保存する必要があります。
    REDOログの耐久性を保証するために
    、トランザクションがコミットされる前に、新しいデータが、バックアップされたREDOログ・レコードを、限りREDOが永続的なログとして、データの永続性を必要としません。データは永続的ではありませんが、システムは、クラッシュしますが、REDOログが永続されている場合は、システムは、REDOログの内容に基づいてすることができ、すべてのデータが最新の状態に復元されます。

    生じる2.業務上の問題

    上記は、我々は異なるデータベースのトランザクション間のアイソレーションのレベルを設定し、この記事の焦点を説明する必要が孤立して、データベースのトランザクションの特性を記述し、トランザクションが並行性の問題を解決します。だから、につながるトランザクションを発行するものについては、次は言いました:

2.1ダーティリード

トランザクションBへの読み出しトランザクションは、変更が、まだ、コミットされたトランザクションBは、Aが以前の矛盾したデータを読み込む場合はロールバックされませんされています。適合性要件事務を満たしていない、
例えば:A(左)とB(図。右)、次のコマンドを実行し、トランザクションを回転させながら:
トランザクションのMySQLの深い理解
ユーザートランザクションをコミットしないが、トランザクションBにおける2つのクエリ内の目に見える結果が変更され、データがコミットされていない読み出しトランザクションです。

2.2非反復可能読み取り

取引データ変更Bにトランザクションが送信されたリード、絶縁を満たしていない、
トランザクションのMySQLの深い理解
図に示すように、トランザクションB Aは、トランザクション・データを変更し、

2.3マジック読書

Bから提出された新しいトランザクションデータへの読み取りトランザクションは、アイソレーションを満たしていない。
トランザクションのMySQLの深い理解
提出新しいトランザクションデータへのトランザクションB;

3.イン深さの分離レベル

分離レベルの評価:
トランザクションのMySQLの深い理解

分離レベルを表示します。

show variables like '%isolation%';
SELECT @@GLOBAL.transaction_isolation, @@transaction_isolation;

分離レベルを設定します:

全局:SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
会话:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

3.1非コミット読み取り

非コミット読み取りは、それがすべての問題を解決しない、データベーストランザクション分離レベルの最低レベルであり、
データベース・トランザクションの分離レベルを設定する非コミット読み取り

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

トランザクションのMySQLの深い理解

3.2リードコミッティ

;読むには、主に汚れの問題が解決読み込みコミット
するために設定されたデータベーストランザクションの分離レベルの読み取りが既に支払わ

SET SESSIONトランザクション分離レベルREAD COMMITTEDが、
トランザクションのMySQLの深い理解
それを見ることができ、読み取りがすでに提出されたダーティ・リードの問題を解決しました。

3.3反復可能読み取り

トランザクション分離レベルを設定します。

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

トランザクションのMySQLの深い理解
;私たちは、トランザクションは、Aは、Bのトランザクションは、もはやトランザクションデータが送信読まないだろう提出された場合であっても、見ることができる
ので、反復可能読み取り修正ファントムがそれを読みますか?
我々はそれを試してみてください。
トランザクションのMySQLの深い理解
これは、それが起こったのかですか?ファントムの問題を解決しない良い反復可能読み取りは、それを読むと言うことではありませんか?この新しいデータがトランザクションで挿入されているのはなぜBでそれを読んでいませんか?(セクションの答えの下で)

3.4直列化

シリアライゼーションは言っていない、それが実際にトランザクションキューイングによって処理されているが、それは非常に低いトランザクションレートになります。

MVCCの4 mysqlの

みましょう例を見て:
トランザクションのMySQLの深い理解
直接取引はA、Bをコミットした後、クエリが実行されると、トランザクションは問題ではありませんけれどもとしては、上記のプロセスの実行から見ることができますが、更新トランザクションBを実行した後、時にクエリを再度、少ない100アカウント以上、このなぜ?

1)MVCC原則

InnoDBはMVCCはそれぞれ二列隠しフィールド、削除作成する際のバージョン番号とバージョン番号の末尾によって達成されます。各トランザクションは、バージョン番号はインクリメントされ開始されます。
SELECT:

  • トランザクションの開始や、独自の事務を超える既存のオペレーティング前にある、取引行が読み取られることを確実にすること、ラインシステムのバージョン番号以下で取引のシステムのバージョン番号である行の現在のトランザクションのバージョンよりも前のバージョンを検索。
  • あなたはトランザクションが行を読むためにことを確認することができるように、トランザクションの開始前に除去されていない、現在のトランザクションのバージョン番号よりも未定義以上のいずれか、行のバージョンを削除し、
    INSERTは:
    行バージョンとして、現在のシステムのバージョン番号を保存するために挿入された行ごとにノー;
    DELETE:
    削除用にマークとして、現在のシステムのバージョン番号を保存するために、それぞれの行を削除します。
    UPDATE:
    現在のシステムのバージョン番号は、行のバージョン番号で保存、新しい行のレコードを挿入し、同時に、オリジナルの削除行を識別するために、現在のシステム・バージョン番号を保存します。

現在の読み取り及び読取2)スナップショット

スナップショットを読む:
読書は歴史のバージョンであるスナップショットのバージョン、である。選択の一般的な読み取りは、スナップショットのある
現在の読み取り:
最新バージョン、更新、削除、挿入を読んで、選択 ...共有モードでロックを、選択します... 更新のために、現在読んでいます。

3.3節は答え困惑
トランザクションAが更新、提出事務を遂行し、トランザクションBが再び更新を実行するとき、それは最新のデータは、トランザクションA(提出されたトランザクションのための前提条件を読むことができるように変更されている、実際に現在の読み取りです)。

3)アンドゥ鎖にバージョンを記録し、ReadView

このコンテンツは、より複雑で、あなたはを参照することができ
https://blog.csdn.net/shenchaohao12321/article/details/92801779

おすすめ

転載: blog.51cto.com/13733462/2453460