MySQL--13--MySQLトランザクションの4つの機能と4つの独立性レベル

2787 ワード

トランザクションとは、単一の論理ワークユニットとして実行される一連のアクションです.すべて実行するか、すべて実行しないかのいずれかです.
一、取引の四つの特性(ACID)
  • 原子性(Atomic)
  • トランザクションに含まれるすべてのアクションは、すべて実行するか、またはすべて実行しない
  • です.
  • 整合性(Consistency)
  • トランザクションは、データベースのステータスが1つのコンシステンシステータスから別のコンシステンシステータス
  • に変換されることを確認します.
  • 例えば、振替で言えば、ユーザーAとユーザーBを合わせて2000元とすると、AとBの間でどのように振り替えても、何回振り替えても、事務が終わった後、2人のユーザーのお金を合わせて2000元になるはずです.これが事務の一致性
  • です.
  • 隔離性(Isolation)
  • 複数のトランザクションが同時に実行される場合、1つのトランザクションの実行は他のトランザクションの実行に影響しません.各トランザクション間で
  • は干渉しません.
  • 持続性(Durability)
  • トランザクションがコミットされると、データベースへの変更はデータベースに永続的に保存されます.データベースに障害が発生しても、データに影響はありません.

  • 二、取引の同時アクセスによる問題
  • 更新が失われました
  • あるトランザクションの更新は、別のトランザクションの更新
  • を上書きします.
  • MySQLすべてのトランザクション独立性レベル
  • はデータベースレベルで回避できます.
  • ダーティリード
  • トランザクションAがデータにアクセス中であり、それを修正してもコミットしていない場合、トランザクションBもそのデータにアクセスするが、読み込まれたのはトランザクションAがコミットしていないデータであり、これはダーティリード
  • である.
  • 繰り返し不可
  • トランザクションAがあるデータを複数回読み出している間に、トランザクションBもそのデータにアクセスして変更してコミットすると、トランザクションBの変更により、トランザクションAの前後2回読み出したデータの内容が一致しなくなり、これは再読み取り不可
  • となる.
  • データの修正
  • に重点を置く.
  • 幻読み
  • トランザクションAがあるデータを複数回読み出している間に、トランザクションBもそのデータにアクセスして追加/削除してコミットすると、トランザクションBの追加/削除により、トランザクションAの前後2回にわたって読み出されたデータの数が一致しなくなり、これが幻読み
  • となる.
  • データの追加/変更
  • に重点を置く.
  • PS:繰り返し読みと幻読みの違い
  • 繰り返し不可
  • は、あるデータを複数回読み出すと、あるカラムの値が
  • に変更されるなど、データの修正に重点を置いている.
  • 幻読み
  • は、データの追加/変更に重点を置く、例えば、あるデータを複数回読み出した場合、データの数が
  • 増加または減少したことを発見する.


    三、トランザクションの四つの独立性レベル
  • 未読コミット(Read Uncommitted)
  • 最も低い独立性レベルで、トランザクションが他のトランザクションからコミットされていないデータを読み込むことができる
  • .
  • 汚れた読み取り、繰り返し不可能な読み取り、幻の読み取り
  • が発生する可能性があります.
  • リードコミット(Read Committed)
  • は、他のトランザクションがコミットしたデータをトランザクションが読み出すことを可能にする
  • である.
  • 汚い読みは避けられますが、繰り返し読み不可、幻読み
  • が発生する可能性があります.
  • は、Oracleのデフォルトの独立性レベル
  • です.
  • リピート可能(Repeatable Read)
  • トランザクションは、あるデータに対する複数回の読み出し結果が一致する
  • である.
  • 汚い読み、繰り返し読みは避けられますが、幻読み
  • が発生する可能性があります.
  • はMySQL(InnoDBストレージエンジン)のデフォルトの独立性レベル
  • です.
  • シリアル化(Serializable)
  • の最も高い独立性レベルは、ACIDの原則に完全に従い、すべてのトランザクションが順次実行され、各トランザクション間で
  • を干渉しない.
  • 汚れた読み取り、繰り返し不可能な読み取り、幻の読み取り
  • を回避
  • PS:トランザクションの独立性レベルを表示、設定する方法
  • トランザクション独立性レベルの表示
    バージョン#バージョン#
    SQL
    MySQL8.0より前select @@tx_isolation;
    MySQL8.0開始SELECT @@transaction_isolation;
  • トランザクション独立性レベルの設定
    独立性レベル
    SQL
    読み取り未送信に設定set session transaction isolation level read uncommitted;
    読み込みコミットに設定set session transaction isolation level read committed;
    リピート可能に設定set session transaction isolation level repeatable read;
    シリアル化に設定set session transaction isolation level serializable;