トランザクションの分離レベル(isolation)と防げる不整合

DBのトランザクション処理で問題となる不整合

Dirty Read

トランザクションAが、「トランザクションBによって変更されたがまだコミットされていないデータ」を読み取る現象。
これにより、変更を行ったトランザクションBがロールバックされた場合、トランザクションAが読み取ったデータは無効な状態となり、データの信頼性が損なわれる。

Non-repeatable Read

トランザクションAの中で同じデータを複数回読み取る際に、トランザクションBによってデータが更新されてしまい、異なる結果が返される現象。
これにより、一貫性のないデータが提供され、トランザクションの信頼性が低下する。

Phantom Read

トランザクションAが特定のクエリを実行して結果を得た後、同じクエリを再実行した際に、トランザクションBによって新たな行が追加されたり、既存の行が削除されたりして、異なる結果セットが返される現象。
これにより、データセットの整合性が保たれないことを意味し、アプリケーションの処理に影響を与える可能性がある。

トランザクションの分離レベル

以下の分離レベルが存在する。

Read Uncommitted

Read Committed

Repeatable Read

トランザクションが開始された時点で読み取ったデータは、そのトランザクションが終了するまで他のトランザクションから見えないように保護される。
これにより、同じトランザクション内でのデータの再読み取りが一貫する。

Snapshot

トランザクションが開始された時点のデータベースのスナップショットが作成され、トランザクションはそのスナップショットに対して操作を行う。
これにより、他のトランザクションによる変更がトランザクションに影響を与えることはない。

Serializable

最も厳格な分離レベルで、トランザクションが他のトランザクションとは完全に独立しているかのように動作する。
これにより、他のトランザクションによるどのような変更も防ぐことができますが、パフォーマンスへの影響が大きくなる可能性がある。

参考

Tags: