【MySQL】データベーストランザクションの詳細分析


一、前言
InnoDBエンジンのみがトランザクションをサポートし、下のコンテンツはInnoDBエンジンがデフォルトです.
二、よくある同時問題
1、汚い読み
あるトランザクションは、別のトランザクションがコミットされていないデータを読み込みます.
2、繰り返し不可
1つのトランザクションが同じデータに対する読み取り結果の前後が一致しません.2回の読み取りの間に他のトランザクションによって変更されました
3、幻読み
幻読みとは、トランザクションがある範囲のデータを読み出す場合、他のトランザクションの操作により前後2回の読み取りの結果が一致しないことを意味します.幻読と再読み取り不可の違いは、再読み取り不可は、特定された1行のデータに対してであり、幻読は不確定な複数行のデータに対してである.したがって、幻読みは通常、クエリー条件付きの範囲クエリーに表示されます.
三、取引隔離レベル
1、未読提出(READ UNCOMMITTED)
汚れた読み取り、繰り返し不可能、幻の読み取りが発生する可能性があります
2、既読提出(READ COMMITTED)
汚れた読みを避けると、繰り返し読みや幻読みができない可能性があります
3、繰り返し読み取り可能(REPEATABLE READ)(mysqlデフォルト隔離レベル)
汚れた読みは避け、繰り返してはいけません.区間ロック技術により幻読みを回避
4、シリアル化(SERIALIZABLE)
シリアル化は、発生する可能性のあるすべての同時異常を回避しますが、システムの同時処理能力を大幅に低下させます.
四、データベースのログはどれらがありますか?
1、undoログ
undoログは、データ変更が変更される前の値を格納するために使用されます.
UNDO LOGにはINSERT_の2種類がありますUNDO(INSERT操作)は、挿入された一意のキー値を記録する.
一つはUPDATE_UNDO(UPDATEおよびDELETE操作を含む)、修正された一意のキー値およびold columnレコードを記録します.
2、redoログ
mysqlは、1つのトランザクションのすべてのsqをredo logに記録してから、レコードをredo logからデータファイルに同期します.
これにより、次のようなメリットが得られます.
  • buffer poolのdirty pageがまだディスクにリフレッシュされていない場合、crashが発生し、サービスを開始した後、redo logを通じてディスクファイルに再リフレッシュする必要がある記録を見つけることができる.
  • buffer poolのデータは直接flushからdisk fileまで、ランダムIOであり、効率が悪いが、buffer poolのデータをredo logに記録するのは、順次IOであり、トランザクションの提出速度を高めることができる.

  • 3、binlogログ
    データベースのプライマリ・スレーブ・レプリケーションに使用されるレコードは、バイナリ・フォーマットです.トランザクションのコミット後にディスク書き込みを行います.
    ここで、redo logとbinary logの違いに注意してください.redo logはストレージエンジン層で発生し、binary logはデータベース層で発生します.大きなトランザクションを仮定して、tbaに10万行のレコードを挿入し、この過程でredo logに順次記録し続け、binary logはこのトランザクションがコミットされるまでbinary logファイルに一度に書き込むことはありません.
    五、データベース取引制御
    1、デフォルトでは、トランザクションの自動コミット機能がオンになります.sqlを実行するたびに、トランザクションのコミットに対応します.
    2、springは下位接続の自動コミット特性をfalseに設定します.手動コミットの使用
    六、取引のACID特性
    1、原子性(Atomicity)
    トランザクション内のすべての操作は、全体として原子のように分割できないか、すべて成功するか、すべて失敗します.
    2、一致性(Consistency)
    トランザクションの実行結果は、データベースを1つのコンシステンシステータスから別のコンシステンシステータスにする必要があります.コンシステンシステータスとは、1.システムの状態はデータの整合性制約(マスターコード、参照整合性、check制約など)2を満たす.システムの状態は、データベースが記述すべき現実世界の実際の状態に反応し、例えば、振り替え前後の2つの口座の金額の合計は変わらないべきである.
    3、隔離性(Isolation)
    同時に実行されるトランザクションは相互に影響しません.データベースへの影響は、シリアル実行時と同じです.例えば、複数のユーザーが同時に1つの口座に振り替えた場合、最後の口座の結果は彼らが前後順に振り替えた結果と同じであるべきだ.
    4、持続性(Durability)
    トランザクションがコミットされると、データベースの更新は永続的です.トランザクションまたはシステム障害によってデータが失われることはありません.
    5、redo logとundo logは原子性、一致性、持続性を実現した
    6、ロック機構は隔離性を実現した
    6.1、スナップショットの読み取り
    読み込んだのはスナップショットバージョン、すなわち履歴バージョンです.普通のSELECTはスナップショット読みです
    6.2、現在の読み取り
    読み込んだのは最新バージョンです.UPDATE、DELETE、INSERT、SELECT ...  LOCK IN SHARE MODE、SELECT ... FOR UPDATEは現在の読みです.
    6.3、ロックリード
    1つのトランザクションでは、標準のSELECT文はロックされませんが、例外は2つあります.SELECT ... LOCK IN SHARE MODEとSELECT...FOR UPDATE.
    SELECT ... LOCK IN SHARE MODE

    レコードに共有ロックを仮定すると、現在のトランザクションがコミットされるまで他のトランザクションは読み取り専用で変更できません.
    SELECT ... FOR UPDATE

    インデックスレコードにロックをかける場合はUPDATEのロックと同じです
    6.4、一貫性非ロック読み
    consistent read(コンシステンシリード)InnoDBは、ある時点でクエリー・データベースのスナップショットを複数バージョンで提供します.独立性レベルがREPEATABLE READの場合、同じトランザクションのすべてのコンシステンシリードは、トランザクションの中で最初にこのようなリードされたスナップショットを読みます.READ COMMITTEDの場合、1つのトランザクションのすべてのコンシステンシリードは、自分でリフレッシュされたスナップショットを読みます.バージョン.Consistent read(コンシステンシリード)は、READ COMMITTEDとREPEATABLE READの独立性レベルでの通常のSELECT文のデフォルトのパターンです.コンシステンシリードは、アクセスしたテーブルに何らかの形式のロックを加えることはありません.そのため、他のトランザクションは同時にそれらを修正することができます.