MySQLデータベースのトランザクション特性

トランザクションのプロパティ

原子性、一貫性、分離性、耐久性:トランザクションは、4つのプロパティを持ちます。これらの4つのプロパティは、通常、ACID特性と呼ばれます。

  • アトミック(不可分):トランザクションは、ワークユニットの不可欠な部分であるべきで、トランザクションは、操作が成功または成功していない含みます。

  • 一貫性(整合性):トランザクションが別の一貫性のある状態に一貫性のある状態にデータベースから変更されます。一貫性とアトミック性は密接に関連しています。

  • 分離(隔離):トランザクションの実行は、他のトランザクション干渉することはできません。すなわち、操作及び取引前取引内部データの使用は、単離されている他の同時トランザクションにコミットされておらず、それぞれ互いに同時に実行トランザクションに影響を与えることができません。

  • 持続性(耐久性):一度正常に送信されたトランザクション、データベース内のデータを変更するには、永続的でなければなりません。次の操作またはその他の障害は、それらに影響を持つべきではありません。

 

同時トランザクションでのデータベースの問題

あなたはトランザクション分離を考慮していない場合は、次のような問題が発生します。

ダーティー読み取り

ダーティ・リードトランザクションは、データが他にコミットされていないトランザクションが読み出される過程を指します。トランザクションがデータを複数回変更されますが、このトランザクションの変更がデータにアクセスするための同時トランザクションその後、コミットされていないで、この何度もされている場合、それは結果データの不整合二つのトランザクションが発生します。

非反復可能読み取り

データベース内のデータの特定の部分のための非反復読み出し手段は、複数のトランザクションクエリはデータ値の異なる範囲を返す(ここでの違いは、一貫性のない1つ以上のコンテンツデータが、データの同じ番号を参照)、そのクエリ間隔は、トランザクションデータが改訂され、他のトランザクションに提出する必要があります。

読書を繰り返し、非読み出し差が汚れている、非反復可能読み取りが提出され、他のトランザクションから読み込まれながら、汚れの読み取りトランザクションは、別のコミットされていないトランザクションからのダーティデータを読み込むです。いくつかのケースでは、非反復可能読み取りが問題ではないことに注意してください。

マジック読書

魔法の読書は、トランザクションが非独立した実行起こる現象です。例えば、すべての行のテーブル内のデータ項目にトランザクションT1は、操作の「2」から「1」に作られたが、今回は表の行の値は、データ項目、データ項目およびトランザクションT2に挿入されますまたは「1」とデータベースにコミット。

私たちはデータを修正するかどうかを確認するために、トランザクションT1のユーザーの操作は、あなたが変更していない行があるでしょう、実際には、このラインは、これはファントム読み取り起こったことである、のような、幻覚のように、トランザクションT2から追加されます。

ファントム読み取りおよび非反復可能読み取り(これはダーティ・リードとは異なる)別のトランザクションが送信された読み出され、差は、非反復可能読み取りが更新で発生することがありされ、削除操作、およびファントムリードは、挿入操作で発生します。

 

 

排他ロック、共有ロック

また、Xロック、書き込みロックとして知られている排他ロック(排他)、。

また、Sロック、読取りロックとして知られている共有ロック(共有)。

リーダーロックとの間に次の関係があります。

  • O SロックOを添加したトランザクションデータオブジェクトが実行されてもよいが、操作を更新することができない操作を読み取ります。O Sを添加するが、Xロックを追加することができないロックすることができ、他のトランザクションのロック時。

  • あなたはO.を読み、更新することができ、トランザクション・データ・オブジェクト・OプラスXロック、ロックO中の他のトランザクションはロックを追加することはできません。

読み取りよりシングルライト:、リーダーロックとの関係は、のように要約することができるされていること

 

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

 

トランザクション分離レベルでいくつかあります。

非コミット読み取り(READ UNCOMMITTED)

この問題を解決するアップデートを失いました。もしトランザクションは、それが他の事項が同時に書き込みを許可していませんので、書き込みを始めますが、他のトランザクションがトリップデータを読み取ることができました。分離レベルは、これらのデータに加えてXをロックする必要があり、いくつかのデータに変更する、すなわちトランザクションの必要性を達成するために、「排他的な書き込みロック」でSロックを追加する必要はありませんデータを読み取ることができます。

コミットを読む(READ COMMITTED)

ダーティ・リードの問題を解決します。読み出しデータトランザクションが他のトランザクションがデータの行へのアクセスを継続できますが、書き込みコミットされていないトランザクションが行にアクセスすることから、他のトランザクションを防ぐことができます。データが完了したことを読んで、すぐ後に、「ロックを読んで共用瞬間」と「排他書き込みロックが」によって達成される。これは、これらのデータをロックに変更されるトランザクションのニーズはXを追加しなければならないこと、することができ、プラス時間は、いくつかのデータをデータSロックを読み取るために必要なSロック解除は、トランザクションが終了するまで待つことはありません。

反復可能読み取り(反復可能読み取り)

禁止非反復読み取り及びダーティ・リード、時にはファントムリードデータが発生する場合があります。読み出しデータトランザクションが書き込みトランザクション(ただし、読み取りトランザクションを可能にすること)によって禁止されて、書き込みトランザクションは、他の取引を禁止します。

デフォルトの分離レベルを使用してMySQLの。これは、「共有読み取りロック」を通って、いくつかの事項は、データがすぐに完了し読まれていない場合、データを読み込むとき、あなたはSロックを追加する必要があり、これらのデータに加えてXをロックする必要があり、データを修正する必要があることを認識し、「彼は、行ロックを書きました」トランザクションのリリースが終了するまでSロック解除、しかし、待って。

シリアライズ(直列化)

読書の魔法の問題を解決します。厳格なトランザクション分離を提供します。これは、トランザクションが同時にではなく、1で行うことができ、トランザクションのシリアル化が必要。専用トランザクションのシリアル化を達成することができない「ロック行レベル」を介して、新たに挿入されたデータは、単に他のメカニズムを介しての取引照会アクセスを実行していないことを確認しなければなりません。

 

MySQLの分離レベルの実装

上記ではない完全達成するために、上述した理論に従って、パフォーマンス上の理由から、データベース理論の概念のいくつかの説明が、そのようなデータベースでのMySQL、ORACLE、です。

MVCC

マルチバージョン同時実行制御(マルチバージョン同時実行制御、MVCC)理論的な方法を達成するためのMySQLベースの楽観的ロックの分離レベルで、かつ読み取りを実現するために反復可能読み取り分離レベルを達成することができますコミット。

実装(分離レベルが反復可能読み取りです)

それは二つの概念の導入を達成するためにどのように来る前に:

  • システムのバージョン番号:増分数、それぞれが新しいトランザクションを開始するには、システムが自動的にバージョン番号をインクリメントします。

  • Servicesバージョン:トランザクションの開始時にシステムのバージョン番号。

MySQLでは、次のデータの各テーブルに2つのフィールドを追加します。

  • バージョン番号を作成:作成するために割り当てられた現在のバージョン番号などのデータの行、システムのバージョン番号を作成する場合

  • バージョン番号を削除します:あなたは、データの行を削除すると、削除されたバージョン番号など、現在のシステムのバージョン番号が割り当てられています

選択する

データの読み出しを選択した場合のルールは以下のとおりです。現在のトランザクションのバージョン番号を<、=現在のトランザクションのバージョン番号バージョン番号が空の削除または>バージョン番号を作成します。

バージョン番号を作成<=現在のトランザクションのバージョン番号は、トランザクションの開始後のデータのうちデータが作成されていないことを確認します。これは、なぜ最初の例では、我々は後から追加されたデータの原因を見つけることができませんで

トランザクションがオープンされる前に、少なくともデータが削除されていないことを確認するために>現在のトランザクションのバージョン番号をバージョン番号が空で削除するか、または、それがデータをチェックアウトする必要があります。

インサート

インサートは、バージョン番号フィールドを作成するために割り当てられている現在のシステムのバージョン番号です。

更新

行に元のバージョンを削除するには、現在のトランザクションを維持しながら、作成された行のバージョン番号である現在のトランザクションバージョン保存、新しいレコードを挿入し、実際には、ここでの更新は、削除によるものであり、達成するために挿入します。

DELETE

あなたは、バージョン番号フィールドを削除するために割り当てられている現在のシステムのバージョン番号を削除すると場所が実際にコミットされた場合でも、識別はトランザクションで削除された行は、データが削除されません。規則によると、データを選択すると、データを照会するオープンされません。

 

ソースリンクします。https://mp.weixin.qq.com/s/aChayHLI3TrJbfYT_oOuHg

おすすめ

転載: www.cnblogs.com/z-qinfeng/p/12129593.html
おすすめ