0Pricing
SQL Academy · レッスン

ACID特性とアノマリー

原子性、一貫性、分離性、永続性と、4つの古典的なアノマリー(ダーティリード、反復不能読み取り、ファントムリード、ロストアップデート)を復習します。

「ACID特性とアノマリー」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

ACID

トランザクションが信頼できるのは、次の性質を満たす場合です。

  • 原子性 — すべて実行されるか、何も実行されない
  • 一貫性 — DBをある有効な状態から別の有効な状態へ移行する
  • 分離性 — 同時実行されるトランザクションが互いに干渉しない
  • 永続性 — いったんコミットされると、クラッシュしてもデータが保持される

SQLのトランザクション

操作を BEGIN ... COMMIT で囲みます。

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- If anything fails, ROLLBACK leaves both rows unchanged.

原子性の実例

2つ目の UPDATE が失敗すると、1つ目もロールバックされるため、途中まで送金された状態にはなりません。

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- Crash here, or ROLLBACK: account 1 is unchanged.

一貫性

制約(NOT NULL、CHECK、FK)はコミット時に検査されます。DBを無効な状態にしてしまうトランザクションは失敗します。

BEGIN;
INSERT INTO orders (user_id, total) VALUES (999, 100);  -- FK fails on commit if user 999 doesn't exist.
COMMIT;
-- ERROR: insert or update violates foreign key constraint
-- ROLLBACK happens automatically.

分離性が重要な理由

分離性がないと、同時実行される2つのトランザクションが互いの見えているデータを壊す可能性があります。代表的な異常は次のとおりです。

  • ダーティリード — コミットされていないデータを読み取る
  • 非反復読み取り — 同じクエリで異なる行が返される
  • ファントム — トランザクションの途中で新しい行が現れる
  • ロストアップデート — 2つの更新が互いの変更を上書きする

ダーティリード

別のトランザクションが変更したものの、まだコミットしていない行を読み取ることです。PostgreSQLはすべての分離レベルでこれを防止します。

非反復読み取り

行1を読み取った後、別のトランザクションが行1の更新をコミットし、もう一度読み取ると、異なる値が返されます。

ファントムリード

1つのトランザクション内で SELECT COUNT(*) を2回実行します。その間に別のトランザクションが INSERT をコミットすると、2回目の件数のほうが大きくなります。

ロストアップデート

2つのトランザクションがどちらも balance=100 を読み取り、どちらも balance=balance-50 を書き込んでコミットすると、-50の更新の一方が失われます。

永続性

COMMIT が返ると、変更はディスク上(または設定によってはレプリケートされた状態)に保存されます。その1ミリ秒後にクラッシュしても、変更は失われません。PostgreSQLはWAL(Write-Ahead Logging)によって永続性を実現しています。

自動コミット

デフォルトでは、各ステートメントが独立したトランザクションになります。

UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- Implicitly: BEGIN; statement; COMMIT;

SAVEPOINT

トランザクション内で部分的にロールバックします。

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT before_step2;
UPDATE accounts SET balance = balance + 100 WHERE id = 999;
-- ERROR — but we can recover:
ROLLBACK TO SAVEPOINT before_step2;
-- continue
COMMIT;

まとめ

トランザクションは、リレーショナルデータベースの安全網です。

  • ACID:原子性、一貫性、分離性、永続性
  • 代表的な4つの異常
  • BEGIN ... COMMIT または ROLLBACK
  • 部分的なロールバックには SAVEPOINT

クイックチェック

2つのトランザクションが同じ値を読み取り、変更して、どちらもコミットした場合、どの異常が発生しますか。

よくある質問

「ACID特性とアノマリー」レッスンは無料ですか?

はい。「ACID特性とアノマリー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「ACID特性とアノマリー」で何を学びますか?

原子性、一貫性、分離性、永続性と、4つの古典的なアノマリー(ダーティリード、反復不能読み取り、ファントムリード、ロストアップデート)を復習します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ACID特性とアノマリー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ACID特性とアノマリー
  2. 分離レベル:READ COMMITTED、REPEATABLE READ、SERIALIZABLE
  3. デッドロック:検出と回避
  4. 楽観的ロックと悲観的ロック
← SQL Academyに戻る