MySQL|トランザクション|ダーティリード|繰り返し不可|幻リード|独立性レベル

6013 ワード

目次
一.取引
1.トランザクションとは
2.事務所が持つ4つの特性
3.原子性
4.一貫性
5.隔離性
二.汚読
1.汚い読みとは
2.ダーティリードの発生を招く場合
三.繰り返し不可
1.繰り返し不可
2.繰り返し不可能な問題が発生した場合
3.繰り返し不可能な問題を解決する方法
四.まぼろし読み
1.幻読みとは
2.幻読みが発生した場合
3.解決方法
五.持続性
六.独立性レベル
1.独立性レベルの分類
2.独立性レベルの区分
一.取引
1.トランザクションとは
私たちが一般的に話しているトランザクションは、MySQLのInnoDBストレージエンジンでサポートされているトランザクションです.イベントとは簡単に言えば、特定のSQL文のセットです.
2.事務所が持つ4つの特性
  • 原子性:1つのトランザクションは分割できない作業単位であり、トランザクションに含まれる操作はすべて(文のセットがすべて実行されたか、すべて実行に成功したか)、またはすべてしない(文のセットがすべて実行に失敗したか).ステップの実行に失敗すると、トランザクションは文の実行前の状態にロールバックされます.
  • 整合性:整合性制約、データ整合性制約とは規範に合わないデータがデータベースに入ることを防止するため、ユーザーがデータに対して挿入、修正、削除などの操作を行う時、DBMSは自動的に一定の制約条件に従ってデータを監視し、規範に合わないデータがデータベースに入ることができないようにし、データベースに格納されたデータが正確であることを確保する.有効、適合.
  • 独立性:1つのトランザクションの実行が他のトランザクションに干渉されてはいけない.すなわち、1つのトランザクション内部の操作および使用されるデータは、同時実行される他のトランザクションから分離され、同時実行される各トランザクション間で相互に干渉することはできません.
  • 永続性:トランザクションが実行された結果がディスク上に永続的に保存されます.トランザクションがコミットされると、データベース内のデータの変更が永続的である必要があります.次の他の操作や障害は、それに影響を与えるべきではありません.

  • この4つの属性は一般にACID特性と呼ばれる.
    3.原子性
    ログシステムには2つのログがあります.それぞれは
  • REDOログ
  • ログなし(undo log)
  • まず、トランザクションがコミットされた後、REDOログはトランザクションが実行するアクションを記録し、次にログの先行を行います.つまり、現在のREDOログに格納されている情報をディスクにリフレッシュしてから、トランザクションの実行を開始します.トランザクションAがステップを実行すると、システムは電源が切れますが、電力が回復した後、トランザクションAがどのような操作を行ったのか、およびどのステップを実行したのかをREDOログで確認できます.つまり、REDOログは、トランザクションがすべて正常に実行されることを保証します.
    ログなしでは、各変更点のステータス(バージョン)が記録され、各データが変更される前と変更された後の値として一般的に理解されます.これで、物事のロールバック(データの最初の状態に戻る)ができます.すなわち、ログが作成されていないと、トランザクションのすべての実行が失敗することが保証されます.
    この2つのログでトランザクションの原子性が保証されます.
    4.一貫性
    原子性と密接に関連していますが、一致性は理解しにくい概念です.興味があれば、このブログを参考にしてください.
    https://blog.csdn.net/qq_26295547/article/details/79828966
    また、知っている回答:
    https://www.zhihu.com/question/31346392
    5.隔離性
    独立性がない場合、トランザクションの実行中にどのような問題が発生しますか?
    ダーティ・リードが表示されます.たとえば、データベースのテーブルにこのようなデータがあります.
    name
    salary
    zhangsan
    5000
    このデータの意味はzhangsanの給料が5000です.トランザクションAが実行されます.まず、トランザクションAは次の操作を行います.
    /*A---Begin*/
    
    select *
    from table_name
    where salary = 5000;
    
    updata table_name
    set salary = 8000
    where name = zhangsan;

    ここまで実行すると、事務Aはすでにzhangsanの給与を8000に変更したが、この場合、タイムスライス法のルールのため、事務Aに割り当てられた時間が経過し(この場合、事務Aの実行は終了しない)、システムは別の事務Bを実行し始め、事務Bは以下の操作を行う
    /*B-----Begin*/
    
    select *
    from table_name
    where salary = 8000;

    このとき、トランザクションBが検索した結果、zhangsanの給与は8000であり、その後、トランザクションBはこのデータに対して他の一連の操作を行い、タイムスライス法のルールのため、トランザクションBに割り当てられた時間が(この時点でトランザクションBの実行は終了していない)になったため、システムはまたトランザクションAを実行し始め、この時点でトランザクションAがこのデータに対して他の操作を行った場合、しかし、あるステップの実行に失敗し、トランザクションの原子性に応じて、トランザクションAは文の実行前の状態にロールバックされます.ロールバック後、zhangsanの給与は5000になりましたが、このとき別のトランザクションBのすべての操作はzhangsanの給与が8000であることに基づいています.これはトランザクションBが読んだデータが汚いデータであり、汚いデータに基づいた操作が間違っていることです.この場合、汚い読みです.
    /*        */
    
    roolback;

    二.汚読
    1.汚い読みとは
    ダーティ・リード:トランザクションAはデータを変更しましたが、コミットされていません.トランザクションBはトランザクションAがコミットされていない更新結果を読みました.トランザクションAのコミットに失敗した場合、トランザクションBはダーティ・データを読みます.
    2.ダーティリードの発生を招く場合
    トランザクション実行中に他のトランザクション実行中に得られた結果.
    三.繰り返し不可
    1.繰り返し不可
    同じデータ
    name
    salary
    zhangsan
    5000
    同様に、トランザクションAは、以下の操作を実行する
    /*A---Begin*/
    
    select *
    from table_name
    where salary = 5000;
    
    updata table_name
    set salary = 8000
    where name = zhangsan;

    次に、トランザクションBが実行を開始し(この時点でトランザクションAは実行終了しない)、トランザクションBは以下の操作を行う
    /*B-----Begin*/
    
    select salary
    from table_name
    where name = zhangsan;

    このとき、事務Bが得た結果、zhangsanの給料は5000であり、受信者システムはまた事務Aを実行し始め、事務Bは一時的に保留されたが、このとき事務Aは何の操作も行わず、この事務Aは終了した.
    /*A------End*/

    システムはまた事務Bを実行し始めて、もし今事務Bが一回zhangsanの給料を照会したら
    select salary
    from table_name
    where name = zhangsan;

    この時、zhangsanの給料はすでに事務によって8000に修正されたので、事務Bの今回の照会操作の結果、zhangsanの給料は8000で、私たちはB事務が何もしていないことに気づいて、同じデータに対して2回の照会操作を行っただけで、2つの異なるデータを手に入れました.この問題は、繰り返し不可と呼ばれます(同じトランザクションでは、同じデータに対して読み込まれた結果が一致しません).
    2.繰り返し不可能な問題が発生した場合
    トランザクションは、実行中に他の異なるフェーズの結果を取得し、変更(updata)操作によるものです.
    3.繰り返し不可能な問題を解決する方法
    繰り返し読み取りができない原因は、トランザクションがレコードを同時に変更することです.このような状況を避けるには、変更するレコードにロックをかけるのが最も簡単です.このため、ロック競争が激化し、パフォーマンスに影響を与えます.もう1つの方法は、MVCCによってロックなしで重複しないようにすることである.
    四.まぼろし読み
    /*A-----Begin*/
    
    insert into table_name
    values(lisi,5000);
    /*B-----Begin*/
    select COUNT(name)
    from table_name
    where salary = 5000;
    /*A-----End*/
    select COUNT(name)
    from table_name
    where salary = 5000;
    
    /*B-----End*/

    まずトランザクションAを実行し、トランザクションAがこの表にデータを挿入し、トランザクションAが保留され、トランザクションBが実行を開始し、トランザクションBが給与5000の従業員の個数を照会した結果、1になり、トランザクションBが保留され、トランザクションAが実行を開始し、このときトランザクションAは他の操作を行わず、トランザクションAが実行を完了して閉じ、次に事務Bが実行を開始すると、事務Bは給与5000の従業員の数を照会したが、結果は2であった.
    1.幻読みとは
    同じトランザクションでは、同じクエリが複数回返される結果が一致しません.
    2.幻読みが発生した場合
    トランザクション実行中に他のトランザクションの異なるフェーズの結果が得られ、挿入(insert)と削除(delete)によって得られます.
    3.解決方法
    ギャップロック、幻読みは同時トランザクションによるレコードの増加によるものであり、これは、新しいレコードに対してロックをかけることができないため、重複しないようにレコードロックによって解決することはできません.幻読みを避けるには、トランザクションをシリアル化する必要があります.
    五.持続性
    トランザクションの永続性をログで保証します.
    六.独立性レベル
    1.独立性レベルの分類
  • 未提出読み(READ-UNCOMMITTED)、最低の隔離レベル、この隔離レベルでは汚れ読み、繰り返し読み不可、幻読みの問題が発生します.
  • (READ-COMMITTED)がコミットされ、SQL Serverのデフォルトの独立性レベルはコミットされた独立性レベルです.この独立性レベルでは、繰り返し読み、幻読みの問題が発生し、汚れた読みの問題を解決することができます.
  • リピート読み取り可能(REPEATABLE-READ)、InnoDBストレージエンジンのデフォルトの独立性レベルはリピート読み取り可能独立性レベルです.この隔離レベルでは幻読みの問題が発生し、汚れた読みを解決できるでしょう.繰り返してはいけません.
  • はシーケンス化可能であり、独立性レベルが最も高く、上述した問題は発生しないが、このような独立性レベルではトランザクション間の関係がシリアル型であり、システムの同時性を犠牲にするため、効率が低すぎる.

  • 現在のシステムの独立性レベルは、次の名前で表示できます.
    select @@tx_isolation;

    独立性レベルを未コミットの読取り独立性レベルに設定
    set tx_isolation = "READ-UNCOMMITED";

    2.独立性レベルの区分
  • グローバル独立性レベル:デフォルトはREPEATABLE-READで、サーバ側に保存されます.
  • セッション独立性レベル:セッション独立性レベルは、レプリケーションされたサーバ側の独立性レベルです.クライアントが表示するのは、セッション独立性レベルです.したがって、ユーザがセッションの独立性レベルを変更しても、他のセッションの独立性レベルは変更されません.