Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ アイソレーション:リピータブルリードおよびシリアライザブルレベル | ACID
SQL最適化とクエリ機能

アイソレーション:リピータブルリードおよびシリアライザブルレベル

メニューを表示するにはスワイプしてください

リピータブルリード(Repeatable Read)

データベースにおけるリピータブルリード分離レベルは、トランザクションを開始した時点のデータベースのスナップショットがタスク全体を通じて変わらないことを保証します。 つまり、作業中に他の変更がデータベースで発生しても、開始時点のデータのみが表示されます。 リピータブルリード分離下のトランザクションは、参照するすべての行に読み取りロックを、挿入・更新・削除する行には書き込みロックを保持します。これにより、ロストアップデート、ダーティリード、ノンリピータブルリードが防止されます。 ただし、この分離レベルでも発生する問題が1つあります。それがファントムリードです。

ファントムリード

Note
さらに学ぶ

ファントムリードは、トランザクションがクエリを再実行した際に、元のクエリのフィルタ条件を満たす異なる行セットが取得される現象です。

例えば、あるトランザクションが合計金額が$1000を超えるすべての注文を検索したとします。もし別のトランザクションが、最初のクエリと2回目のクエリの間にこの条件を満たす新しい注文を挿入した場合、最初のトランザクションは2回目の実行時にこの追加行を確認し、ファントムリードが発生します。

ファントムリードは、1つのトランザクションがデータを読み取っている間に、別のトランザクションが新しいレコードをデータベースに追加した場合に発生します。その結果、2回連続して読み取りを行うと、異なる結果セットが得られることがあります。

phantom_read

非再読可能読み取りとファントムリードの違い

非再読可能読み取りは、ユーザーAが同じクエリを実行した際、同じ行に対して異なる値が連続した読み取りで返される現象であり、通常はユーザーBによる更新が原因となります。

一方、ファントムリードは、ユーザーAが同じクエリを実行した際、異なる行セットが連続した読み取りで返される現象であり、個々の行自体は更新されていない場合でも発生します。

この分離レベルは、次のコマンドを使用してSQLクエリで指定できます:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

シリアライザブル

シリアライザブル分離レベルは、データベースにおける最も高い分離レベルであり、最も厳格な同時実行制御を保証します。
このレベルでは、トランザクションは逐次的に処理されたかのように実行され、実際には同時に実行されていても、結果は何らかの直列順序で実行された場合と同じになります。これにより、一貫性が維持され、既知のすべての同時実行異常が防止されます。

Note

この分離レベルを使用すると、ロックの増加によりパフォーマンスが低下する場合があります。

このアイソレーションレベルをSQLクエリで設定するには、次のステートメントを使用。 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

question-icon

アイソレーションレベルとその説明の組み合わせ。

Read Uncommitted:
Read Committed:

Repeatable Read:

Serializable:

クリックまたはドラッグ`n`ドロップして空欄を埋めてください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  7

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  7
some-alt