アイソレーション
メニューを表示するにはスワイプしてください
データベースの文脈において、分離性(アイソレーション)とは、データベースシステムが同時実行されるトランザクションによる変更の可視性を制御する能力を指します。これにより、トランザクション同士が互いに独立して動作し、干渉を避けてデータの整合性を維持します。
SQLには4つの分離レベルがあります:
- read uncommitted;
- read committed;
- repeatable read;
- serializable。
Read uncommitted
これは最も低い分離レベルであり、トランザクションは他のトランザクションによる変更がコミットされる前でも見ることができます。このレベルではダーティリードが許可されており、他のトランザクションによって変更されたがまだコミットされていないデータを読み取ることができます。
ダーティリード
実装
トランザクションの分離レベルを指定するには、クエリ内で次のコマンドを使用します:
-- Start transaction
BEGIN;
-- Set the isolation level for the transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
/* Transaction query */
COMMIT;
-
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;:このステートメントは現在のトランザクションの分離レベルを「Read Uncommitted」に変更し、他の未コミットのトランザクションによって変更されたデータを読み取ることを可能にします; -
このコマンドはトランザクションブロック内でのみ使用する必要があります! それ以外の場合は効果がなく、デフォルトの分離レベルが使用されます。
現在の分離レベルを確認するには、次のコマンドを使用できます:
SHOW TRANSACTION ISOLATION LEVEL;
Read committed
Read Committed分離レベルは、トランザクションが他のトランザクションによってコミットされたデータのみを参照できることを保証します。
つまり、他のトランザクションによる未コミットの変更は、Read Committed分離下で動作するトランザクションからは見えません。
その結果、トランザクションはコミット済みデータのみを読み取るため、ダーティリードを防ぎます。ただし、この分離レベルではノンリピータブルリードの問題が発生します。
ノンリピータブルリード
「Read committed」分離レベルは、未コミットのトランザクション中の値に対して読み取り操作にロックをかけるが、書き込み操作にはロックをかけないため、再読不能(non-repeatable reads)が発生する。
その結果、他のトランザクションが現在読み取っている行に新しいデータを書き込むことができる。
ロストアップデート
書き込みロックが存在しないため、read committed分離レベルにはもう一つの問題、ロストアップデートがある。
ロストアップデートは、2つの並行トランザクションが同じ行を変更しようとした場合に発生する。その結果、後からコミットされたトランザクションが、他のトランザクションによってコミットされた値を上書きしてしまう。
実装
この分離レベルは、以下のコマンドを使用して指定することも可能。
-- Start transaction
BEGIN;
-- Set the isolation level for the session
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
/* Transaction query */
COMMIT;
Read Committedはほとんどのデータベース管理システムでデフォルトの分離レベルであるため、明示的に指定しなくてもよい点に注意。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください