MySQLのトランザクション独立性レベル

1977 ワード

トランザクションのプロパティ(ACID)
  • 原子間性(Atomicity):1つのトランザクションは分割できない最小の作業と見なされなければならない.トランザクション全体のすべての操作はすべてコミットに成功するか、すべてロールバックに失敗するか、1つのトランザクションにとって、その一部だけを
  • に実行することはできない.
  • コンシステンシ(Consistency):データベースは常に1つのコンシステンシの状態から別のコンシステンシの状態に変換されます.
  • 隔離性(Isolation):ある事務所が行った修正は、最終的に提出される前に、他の事務には表示されません.同じ時間に、同じデータを要求するトランザクションは1つだけ許可され、異なるトランザクション間では互いに干渉はありません.
  • 持続性(Durability):トランザクションがコミットされると、トランザクションによるデータベースのすべての更新がデータベースに保存され、ロールバックできません.

  • トランザクションが同時に存在する問題
  • ダーティ・リード:トランザクションはコミットされていないデータを読み取ります.たとえば、トランザクションAがトランザクションBの更新データを読み出し、トランザクションBがロールバックすると、Aが読み出したデータは汚れたデータになります.
  • 繰り返し不可:同じトランザクションで同じクエリーを2回実行し、結果が一致しません.例えば、トランザクションAが同じデータを複数回読み出し、トランザクションBがトランザクションAが複数回読み出している間に、データを更新してコミットし、トランザクションAが複数回同じデータを読み出した場合、結果が一致しない.
  • 幻読:あるトランザクションがある範囲のレコードを読み取ると、別のトランザクションがその範囲に新しいレコードを挿入し、前のトランザクションが再びその範囲のレコードを読み取ると、幻行が生成されます.InnoDBは、マルチバージョン同時制御(MVCC)により、幻読みの問題を解決することができる.

  • トランザクション独立性レベル
  • READ UNCOMMITTED(コミットされていない読み取り):1つのトランザクションの修正操作がコミットされていなくても、他のトランザクションに対しても表示されます.汚れた読み取りの問題が発生します
  • READ COMMITTED(提出読み):一つの事務が始まると、すでに提出した事務所の修正しか「見られない」.汚れた読み取りの問題は解決したが、再読み取り不可能な問題が存在する
  • REPEATABLE READ(リピート可能):同じレコードを複数回読み出すトランザクションの結果は一致します.汚れた読み取りと再読み取り不可の問題を解決したが、幻読みの問題は解決できなかった.
  • SERIALIZABLE(シリアル化可能):読み出した各ローのデータにロックをかけ、トランザクションのシリアル実行を強制することで、汚れた読み取り、重複しない読み取り、幻の読み取りの問題を回避するが、性能は
  • である.
    独立性レベル
    ダーティリードの可能性
    繰り返し不可能な可能性
    幻読みの可能性
    ロックリード
    読み取り未コミット(read-uncommitted)
    Yes
    Yes
    Yes
    No
    繰り返し不可(read-committed)
    No
    Yes
    Yes
    No
    リピート可能(repeatable-read)
    No
    No
    Yes
    No
    シリアル化可能(serializable)
    No
    No
    No
    Yes
    まとめ
  • トランザクションの独立性レベルは、「シリアル化」>「繰返し可能」>「繰返し不可」>「読取り未提出
  • 」にソートされます.
  • は繰り返し読み取り不可である記録の修正操作であり、幻読みは記録の挿入操作
  • である.
  • MySQLのデフォルトのトランザクション独立性レベルはREPEATABLE-READです.show variables like 'transaction_isolation';コマンドで
  • を表示できます.