モジュールのレッスン (4/4)
トランザクション: オールオアナッシング
トランザクションは、データベースが次のように扱う操作のグループです。
単一ユニット: すべてが成功するか、どれも残らないかのどちらかです。
痕跡。これは、シーケンスの実行時に不一致から身を守る方法です。
UPDATE/INSERT/DELETE は一貫性を保つ必要があります。
構文
BEGIN; -- apri la transazione
UPDATE …;
INSERT …;
DELETE …;
SELECT …; -- puoi anche solo leggere
COMMIT; -- conferma tutte le modifiche
-- oppure
ROLLBACK; -- annulla tutte le modifiche, come se nulla fosseBEGIN と COMMIT の間のすべてはアトミックです。他の接続はありません。
中間状態が見えます。プログラムがクラッシュまたは実行された場合
ROLLBACK では、データベースは BEGIN 以前とまったく同じままになります。
古典的なシナリオ: 転送
典型的な例は、製品間の株式移転 (または金銭の移転) です。
アカウント間の転送): 2 つの UPDATE は 一緒に成功する必要があります、
決して一方がイエスでもう一方がノーということはありません。
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;2 番目の UPDATE が失敗した場合 (CHECK 制約エラーなど)、
ROLLBACK は、製品 1 の在庫を元の値に戻します。
ROLLBACK: DBA のデバッガ
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1; -- "vedo come è cambiato"
ROLLBACK;実際のデータで UPDATE を試すための非常に便利なパターン:
それを実行し、同じトランザクション内の SELECT を使用して結果を検査します。
納得できない場合は、ROLLBACK — データベースはまったく同じです
それは前でした。
SAVEPOINT: 部分的なロールバック
トランザクション内で中間ポイントを作成できます。
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT; -- solo il primo UPDATE viene confermato30秒でACID
トランザクションは ACID プロパティを保証します。
- Aトミシティ — 全か無か。
- Consistency — トランザクションの開始時と終了時に制約が満たされたままになります。
- Isolation — 同時トランザクションは中間状態 (さまざまな「レベル」) を認識しません。
- D耐久性 — 成功した
COMMITは、クラッシュが発生した場合でも失われません。
あなたの番です
1 つのトランザクションで、製品 1 の在庫を 1 つ減らし、製品 2 の在庫を 1 つ増やします。BEGIN で開き、COMMIT で閉じます。
ヒントを表示
それぞれの SET 句で、stock - 1 およびstock + 1 を参照します。
3 回の試行後に解決策が利用可能になります
復習演習
トランザクションを開き、id=1 の顧客の都市を「Sperimentale」に更新してから、ROLLBACK で操作をキャンセルします。最終的に、顧客 1 の都市は元の都市 (「ミラノ」) でなければなりません。
ヒントを表示
ROLLBACK は、BEGIN 以降に行われたすべての変更をキャンセルします。
3 回の試行後に解決策が利用可能になります