アイソレーション
メニューを表示するにはスワイプしてください
データベースの文脈において、分離性(アイソレーション)とは、データベースシステムが同時実行されるトランザクションによる変更の可視性を制御する能力を指します。これにより、トランザクション同士が互いに独立して動作し、干渉を避け、データの整合性を維持します。
SQLには4つの分離レベルがあります:
- read uncommitted(リード・アンコミッテッド)
- read committed(リード・コミッテッド)
- repeatable read(リピータブル・リード)
- serializable(シリアライザブル)
Read uncommitted
これは最も低い分離レベルであり、トランザクションは他のトランザクションによる変更がコミットされる前でも見ることができます。このレベルではダーティリードが許可されており、他のトランザクションによって変更されたがまだコミットされていないデータを読み取ることができます。
ダーティリード
ダーティリードは、あるトランザクションが他のトランザクションによって変更されたが、まだコミットされていないデータを読み取る場合に発生します。
例えば、2つの銀行取引が同時に行われているとします。トランザクションAが口座残高を確認し、トランザクションBが口座に入金しています。 トランザクションAがトランザクションBの処理が完了する前に増加した残高を確認した場合、それはダーティリードです。なぜなら、トランザクションBが失敗した場合、新しい残高がロールバックされる可能性があるからです。
実装
トランザクションの分離レベルを指定するには、クエリ内で次のコマンドを使用します:
-- 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分離レベルで動作するトランザクションからは見えません。
その結果、コミット済みデータのみを読み取ることでダーティリードを防ぎます。ただし、このトランザクションレベルには**非再現読取(ノンリピータブルリード)**の問題があります。
非再現読取
非再現読取は、同じトランザクション内で同じ行を複数回読み取った際、他のトランザクションによる変更によって読み取るデータが変化する場合に発生します。この不整合は予期しない動作や誤った結果につながる可能性があります。
例えば、あるトランザクションが顧客の口座残高を2回照会したとします。最初のクエリでは$1000が返されますが、トランザクションが完了する前に別のトランザクションが口座に$500を入金します。2回目のクエリでは$1500が表示され、これにより、同じデータを1つのトランザクション内で異なる値として読み取る非再現読取が発生します。
「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つを試してチャットを始めてください