アイソレーション:リピータブルリードおよびシリアライザブルレベル
メニューを表示するにはスワイプしてください
リピータブルリード(Repeatable Read)
データベースにおけるリピータブルリード分離レベルは、トランザクションを開始した時点のデータベースのスナップショットがタスク全体を通じて変わらないことを保証します。 つまり、作業中に他の変更がデータベースで発生しても、開始時点のデータのみが表示されます。 リピータブルリード分離下のトランザクションは、参照するすべての行に読み取りロックを、挿入・更新・削除する行には書き込みロックを保持します。これにより、ロストアップデート、ダーティリード、ノンリピータブルリードが防止されます。 ただし、この分離レベルでも発生する問題が1つあります。それがファントムリードです。
ファントムリード
ファントムリードは、トランザクションがクエリを再実行した際に、元のクエリのフィルタ条件を満たす異なる行セットが取得される現象です。
例えば、あるトランザクションが合計金額が$1000を超えるすべての注文を検索したとします。もし別のトランザクションが、最初のクエリと2回目のクエリの間にこの条件を満たす新しい注文を挿入した場合、最初のトランザクションは2回目の実行時にこの追加行を確認し、ファントムリードが発生します。
ファントムリードは、1つのトランザクションがデータを読み取っている間に、別のトランザクションが新しいレコードをデータベースに追加した場合に発生します。その結果、2回連続して読み取りを行うと、異なる結果セットが得られることがあります。
非再読可能読み取りとファントムリードの違い
非再読可能読み取りは、ユーザーAが同じクエリを実行した際、同じ行に対して異なる値が連続した読み取りで返される現象であり、通常はユーザーBによる更新が原因となります。
一方、ファントムリードは、ユーザーAが同じクエリを実行した際、異なる行セットが連続した読み取りで返される現象であり、個々の行自体は更新されていない場合でも発生します。
この分離レベルは、次のコマンドを使用してSQLクエリで指定できます:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
シリアライザブル
シリアライザブル分離レベルは、データベースにおける最も高い分離レベルであり、最も厳格な同時実行制御を保証します。
このレベルでは、トランザクションは逐次的に処理されたかのように実行され、実際には同時に実行されていても、結果は何らかの直列順序で実行された場合と同じになります。これにより、一貫性が維持され、既知のすべての同時実行異常が防止されます。
Note
この分離レベルを使用すると、ロックの増加によりパフォーマンスが低下する場合があります。
このアイソレーションレベルをSQLクエリで設定するには、次のステートメントを使用。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください