モジュールのレッスン (1/4)
ACID トランザクション (BEGIN/COMMIT)
データベースの信頼性の基盤は ACID の頭字語に基づいています。
- Aトミシティ: 操作は完全に完了するか (コミット)、中途半端なトレースを残さずに失敗します (ロールバック)。
- C一貫性: データベース ルール (制約、外部キーなど) は常に尊重されます。
- Isolation: 同時に発生するトランザクションは、制御されない形で相互に干渉しません。
- 耐久性: コミット後、変更は不可逆的にディスクに書き込まれます。
トランザクション構文
通常、単一の UPDATE または DELETE クエリはそれぞれスタンドアロン トランザクション (自動コミット) として扱われます。ただし、顧客の口座からの引き落としや注文など、複数の操作をグループ化する場合は、トランザクション構文を使用して明示的に行う必要があります。
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 アプリが問題があることに気付いた場合 (たとえば、倉庫に十分な在庫がなく、クラッシュした場合)、次のメッセージが送信されます。
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block自分で試してみてください
トランザクションを開きます。\nID 10 の製品を更新し、一時テーブルでその「数量」を 0 に設定します (いや、お待ちください、「数量」は製品にありません。発明しましょう: 'order_items' の 'unit_price' を変更しますが、これには制約が必要です。\nさらに改善しましょう: 注文 ID 5 のステータスを「出荷済み」に更新し、トランザクションを正常に完了します。
ヒントを表示
BEGIN; で開始し、id = 5 の注文を status='shipped' に変更し、COMMIT; で送信します。
3 回の試行後に解決策が利用可能になります
本番中パニック!開発者が WHERE なしで DELETE を書き、すべてのレビューを消去してしまいました。\nロールバックがどのように行われるかを説明しましょう。トランザクションを開始し、(WHERE 句なしで) 'レビュー' からすべてを消去する簡単な DELETE を実行します。その後、ブロックを完了する前に SQL ライフセーバーを使用して影響を元に戻します。
ヒントを表示
BEGIN;、「レビュー」の白紙の削除、そして魔法の ROLLBACK;最後に。
3 回の試行後に解決策が利用可能になります