SQLにおけるトランザクション処理の一つとして「リードコミット(Read Committed)」と「リピータブルリード(Repeatable Read)」があります。これらは、トランザクション内でのデータの整合性や同時実行制御に影響を与える非常に重要な概念です。しかし、これらの違いや具体的な挙動がいまいち理解しづらいという方も多いでしょう。今回の記事では、リードコミットとリピータブルリードの違いをテーブルを用いて分かりやすく解説します。
トランザクションとは?
トランザクションとは、データベースに対する一連の操作のことを指します。これにより、データの整合性が保たれます。一般的には、トランザクションの途中でエラーが発生した場合、そのトランザクション内のすべての操作はロールバック(取り消し)されます。
ACID特性
データベースのトランザクションが持つべき特性として、ACID特性(Atomicity、Consistency、Isolation、Durability)があります。
- Atomicity(原子性): トランザクション内のすべての操作が完全に実行されるか、全く実行されない。
- Consistency(一貫性): トランザクションがデータベースを一貫した状態から一貫した状態へと遷移させる。
- Isolation(隔離性): 並行して実行されるトランザクションが他のトランザクションに影響を与えない。
- Durability(耐久性): トランザクションが成功した場合、その結果は永続する。
リードコミットとリピータブルリードの基本概念
リードコミットとリピータブルリードは、トランザクションのIsolation(隔離性)に関連する概念です。これらは、他のトランザクションがデータにどのような影響を与えるかを制御します。
項目 | リードコミット | リピータブルリード |
---|---|---|
読み取り整合性 | コミット後のデータのみ参照 | トランザクション開始時点のデータを参照 |
非反復可能読み取り | 発生する | 発生しない |
ファントム読み取り | 発生する | 発生しない(一部DBで発生) |
実例で理解する
具体的なシナリオを元に、リードコミットとリピータブルリードの挙動の違いを見ていきましょう。
リードコミットのケース
例として、商品の在庫数が5個で、2つのトランザクションA、Bが並行して実行されるシナリオを考えます。
-- トランザクションA
BEGIN TRANSACTION;
SELECT 在庫数 FROM 商品 WHERE 商品ID = 1; -- 在庫数5を読み取る
-- ここでトランザクションBが在庫数を4に更新
UPDATE 商品 SET 在庫数 = 4 WHERE 商品ID = 1;
COMMIT;
-- トランザクションB
BEGIN TRANSACTION;
UPDATE 商品 SET 在庫数 = 4 WHERE 商品ID = 1;
COMMIT;
トランザクションAが再度在庫を読み取ると、在庫数は4になっています。これがリードコミットの特性です。
リピータブルリードのケース
リピータブルリードでは、トランザクションが開始された時点のデータを参照し続けます。
-- トランザクションA
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION;
SELECT 在庫数 FROM 商品 WHERE 商品ID = 1; -- 在庫数5を読み取る
-- ここでトランザクションBが在庫数を4に更新
COMMIT;
トランザクションAが再度在庫を読み取ると、在庫数は依然として5です。
まとめ
リードコミットとリピータブルリ
ードの違いを理解することは、データの整合性を保つ上で非常に重要です。リードコミットは最新のコミット済みデータを読み取るため、データの変更が反映されます。一方で、リピータブルリードはトランザクション開始時の状態を維持するため、他のトランザクションの影響を受けにくいです。用途や要件に応じて適切な隔離レベルを選ぶ必要があります。
コメント