メインコンテンツにスキップ
モジュール 11 · レッスン 1 / 4コース内の 41/57~15 min
モジュールのレッスン (1/4)

ACID トランザクション (BEGIN/COMMIT)

データベースの信頼性の基盤は ACID の頭字語に基づいています。

  • Aトミシティ: 操作は完全に完了するか (コミット)、中途半端なトレースを残さずに失敗します (ロールバック)。
  • C一貫性: データベース ルール (制約、外部キーなど) は常に尊重されます。
  • Isolation: 同時に発生するトランザクションは、制御されない形で相互に干渉しません。
  • 耐久性: コミット後、変更は不可逆的にディスクに書き込まれます。

トランザクション構文

通常、単一の UPDATE または DELETE クエリはそれぞれスタンドアロン トランザクション (自動コミット) として扱われます。ただし、顧客の口座からの引き落としや注文など、複数の操作をグループ化する場合は、トランザクション構文を使用して明示的に行う必要があります。

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

これらの複雑な実行中に、クエリを送信した JavaScript アプリが問題があることに気付いた場合 (たとえば、倉庫に十分な在庫がなく、クラッシュした場合)、次のメッセージが送信されます。

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

自分で試してみてください

運動#sql.m11.l1.e1
試行回数: 0読み込み中…

トランザクションを開きます。\nID 10 の製品を更新し、一時テーブルでその「数量」を 0 に設定します (いや、お待ちください、「数量」は製品にありません。発明しましょう: 'order_items' の 'unit_price' を変更しますが、これには制約が必要です。\nさらに改善しましょう: 注文 ID 5 のステータスを「出荷済み」に更新し、トランザクションを正常に完了します。

エディターを読み込み中…
ヒントを表示

BEGIN; で開始し、id = 5 の注文を status='shipped' に変更し、COMMIT; で送信します。

3 回の試行後に解決策が利用可能になります

運動#sql.m11.l1.e2
試行回数: 0読み込み中…

本番中パニック!開発者が WHERE なしで DELETE を書き、すべてのレビューを消去してしまいました。\nロールバックがどのように行われるかを説明しましょう。トランザクションを開始し、(WHERE 句なしで) 'レビュー' からすべてを消去する簡単な DELETE を実行します。その後、ブロックを完了する前に SQL ライフセーバーを使用して影響を元に戻します。

エディターを読み込み中…
ヒントを表示

BEGIN;、「レビュー」の白紙の削除、そして魔法の ROLLBACK;最後に。

3 回の試行後に解決策が利用可能になります