CodeGym /コース /SQL SELF /トランザクションを深掘りしよう

トランザクションを深掘りしよう

SQL SELF
レベル 39, レッスン 0
使用可能

このコースの前の方でもトランザクションについてちょっと話したよね。もう一度おさらいすると、トランザクションっていうのは「一つのまとまりとして実行される一連の操作」のこと。例えば銀行振込をするとき、お金を一つの口座から引き落として、別の口座に入金するよね。もしどっちかが失敗したら(例えば引き落としはできたけど入金できなかったとか)、めっちゃ困ることになる。こういう時にトランザクションが役立つんだ。

トランザクションは全部実行されるか、全く実行されないかのどっちかしかない。これが「全部かゼロか」の原則だよ。

BEGIN;
-- ある口座の残高を減らす
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 別の口座の残高を増やす
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT; -- 変更を確定する

もし何かうまくいかなかったら、ROLLBACKで変更を元に戻せるよ。

ACIDプロパティって何?

PostgreSQL(てかリレーショナルデータベース全般)でトランザクションの話をするとき、よくACIDって略語が出てくるけど、これは化学の話じゃないよ。ACIDはAtomicity(アトミック性), Consistency(一貫性), Isolation(分離性), Durability(永続性)の頭文字。これら4つのプロパティがあるから、データが安全に、順序通りに、予想外のことなく処理されるんだ。

アトミック性(Atomicity)
トランザクションは全部実行されるか、全く実行されないかのどっちか。途中で何か失敗したら、全部元に戻る。例えばお金を送金してる途中でエラーが起きたら、全部キャンセルされるか、全部ちゃんと終わるかのどっちか。「半分だけ実行」みたいなことは絶対にない。

一貫性(Consistency)
トランザクションが終わった後、データベースは正しい状態になってる。全部のルールや制約、テーブル間の関係も守られてる。例えば「残高がマイナス禁止」ってルールがあったら、それを破るトランザクションは保存されない。

分離性(Isolation)
一つのトランザクションが終わるまで、他のトランザクションはその途中のデータを見れない。これで「なんか変な状態のデータが見えちゃう」みたいなことを防げる。例えばネットショップでお金は引き落とされたのに、商品がまだ注文に追加されてない…みたいなことが起きたら嫌だよね?

永続性(Durability)
トランザクションがちゃんと終わったら、その変更は絶対に保存される。たとえ直後に停電しても、データはちゃんと残ってる。まるで「保存」ボタンを押して、絶対に消えないって安心できる感じ。

この4つのプロパティがあるからこそ、トランザクションはデータベースで信頼できる仕組みになってるんだ。

トランザクションが役立つシナリオ例

理論も大事だけど、トランザクションの本当の強みは実際の現場で発揮される。お金のやりとり、関連テーブルの更新、大量のデータ変更…こういう時にトランザクションは欠かせないツール。単に操作を実行するだけじゃなくて、データを失ったり、データベースが「半分だけ動いてる」状態になるリスクを防いでくれる。

トランザクションが本当に助けてくれる典型的な例をいくつか紹介するね:

1. 支払い処理

お客さんが一つの口座から別の口座にお金を送るとき、トランザクションがあればお金がどこかに消えたりしない:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;

もし最初の口座に十分なお金がなかったら、変更を元に戻せる:

BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
-- あっ、残高がマイナスになっちゃった!
ROLLBACK;

2. 関連テーブルの更新

例えば、学生のステータスを「卒業」に更新して、同時に「卒業生」テーブルにレコードを追加する場合:

BEGIN;
UPDATE students SET status = '卒業' WHERE student_id = 42;
INSERT INTO graduates (student_id, graduation_date) VALUES (42, '2023-06-10');
COMMIT;

もしどっちかの操作が失敗したら(例えばINSERTでエラーが出たら)、データベースは最初の状態に戻るよ。

3. 大量データの一括更新

トランザクションは大量の更新をするときにも便利。例えば:

BEGIN;
UPDATE orders SET status = '完了' WHERE delivery_date < CURRENT_DATE;
COMMIT;

もしサーバーが落ちたり、「やば、間違った!」ってなったら、いつでも変更を元に戻せる!

トランザクション操作のコマンド

PostgreSQLにはいくつかの基本コマンドがあるよ:

  • BEGIN: 新しいトランザクションを始める:

    BEGIN;
    
  • COMMIT: トランザクション内で行った全ての変更を確定(保存)する:

    COMMIT;
    

ROLLBACK: 今のトランザクションで行った全ての変更を元に戻す:

ROLLBACK;

フルサイクルの例

BEGIN;
-- いくつかの操作
UPDATE accounts SET balance = balance - 200 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2;

-- 変更をやっぱり元に戻す
ROLLBACK;

-- もう一度始める
BEGIN;
-- 同じ操作だけど、別の金額で送金
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- トランザクションを完了
COMMIT;

教科書の外のトランザクションの世界

ネットショップ。 多くのプラットフォームはトランザクションを使って注文や支払いを管理してる。例えば、支払いが成功した時だけ注文が確定する。もし何か問題があったら、注文は自動でキャンセルされる。

銀行システム。 トランザクションは、突然の停電みたいなトラブルからあなたのお金を守ってくれる。

トランザクション履歴。 PostgreSQLはWAL(Write-Ahead Logging)っていうログを保存してて、障害が起きてもデータを復元できる。これがトランザクションを信頼できるものにしてる魔法なんだ。

次の講義では、BEGIN、COMMIT、ROLLBACKのコマンドをもっと詳しく見ていくし、大量操作やSAVEPOINTを使った部分的なロールバックの例も紹介するよ。じゃあまたね!

2
タスク
SQL SELF, レベル 39, レッスン 0
ロック未解除
トランザクションを使った一括更新
トランザクションを使った一括更新
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION