🫙

トランザクション分離レベルについて

2024/05/04に公開

What is Transaction?

分けることのできない一連の情報処理の一単位を意味する。
データベース内のデータの一貫性と整合性が保証される。
相互依存のある複数の操作が全て完了するか、全てキャンセルされることを保証する。

What is ACID?

トランザクション処理の信頼性を保証するために求められる性質。1970年代後半にジム・グレイが定義した概念。

  • 原子性(atomicity)
    トランザクションに含まれるタスクが全て実行されるか、あるいは全く実行されないことを保証する性質をいう。アトミック性、原子性とも呼ばれる。
    トランザクションはそれ以上細かい単位に分割することができない作業単位である
  • 一貫性(consistency)
    トランザクションの実行前と後でデータに矛盾がなく整合性が保たれる性質です。整合性とも呼ばれる。
  • 分離性(isolation)
    トランザクション中に行われる操作は他のトランザクションに影響を与えない性質。つまり、それぞれのトランザクションは分離された状態で操作を行わなければない。
  • 永続性(durability)
    トランザクション操作の完了通知をユーザが受けた時点で、その操作は永続的となり、結果が失われないことを指す。持続性とも呼ばれる。多くのデータベース実装では、トランザクション操作を永続性記憶装置上にログとして記録し、システムに異常が発生したらそのログを用いて異常発生前の状態まで復旧することで永続性を実現している。

What is Transaction isolation level?

データベース管理システム上での一括処理(トランザクション)が複数同時に行われた場合に、どれほどの一貫性、正確性で実行するかを4段階で定義したもの

Standard SQL transaction isolation level

分離レベル ダーティリード ファジーリード ファントムリード
SERIALIZABLE × × ×
REPEATABLE READ × ×
READ COMMITTED ×
READ UNCOMMITTED
  • ダーティリード (Dirty Read)
    他のトランザクションでコミットされていないデータや不完全なデータ、計算途中のデータを読み取ってしまう動作。
  • ファジーリード/ノンリピータブルリード (Fuzzy Read / Non-Repeatable Read)
    同じトランザクション中でも同じデータを読み込むたびに値が変わってしまう現象が発生する可能性がある。
  • ファントムリード (Phantom Read)
    並行して動作する他のトランザクションが追加したり削除したデータが途中で見えてしまうため、処理の結果が変わってしまう。

SERIALIZABLE(直列化可能)

  • 複数の並行に動作するトランザクションそれぞれの結果が、いかなる場合でも、それらのトランザクションを時間的重なりなく逐次実行した場合と同じ結果となる。SERIALIZABLEは最も強い分離レベルであり、最も安全にデータを操作できるが、相対的に性能は低い。
    • ただし同じ結果とされる逐次実行の順はトランザクション処理のレベルでは保証されない。

REPEATABLE READ(読み取り対象のデータを常に読み取る)

  • ひとつのトランザクションが実行中の間、読み取り対象のデータが途中で他のトランザクションによって変更される心配はない。同じトランザクション中では同じデータは何度読み取りしても毎回同じ値を読むことができる。
    • ただし ファントム・リード(Phantom Read) と呼ばれる現象が発生する可能性がある。
  • MySQLのデフォルトのトランザクション分離レベル

READ COMMITTED(確定した最新データを常に読み取る)

  • 他のトランザクションによる更新については、常にコミット済みのデータのみを読み取る。 MVCC はREAD COMMITTEDを実現する実装の一つである。
    • ただしファントム・リード に加え、非再現リード(Non-Repeatable Read)と呼ばれる現象が発生する可能性がある。
  • Oracle、PostgreSQL、SQL Serverでデフォルトのトランザクション分離レベル

READ UNCOMMITTED(確定していないデータまで読み取る)

  • 他の処理によって行われている、書きかけのデータまで読み取る。
    • ただし、PHANTOM 、 NON-REPEATABLE READ 、さらに ダーティ・リード(Dirty Read)と呼ばれる現象が発生する可能性がある。トランザクションの並行動作によってデータを破壊する可能性は高いが、その分性能は高い。

Appendix

Discussion