PL/SQL - 交易:初學者指南

您好,未來的數據庫大師!今天,我們將踏上一段令人興奮的旅程,進入 PL/SQL 交易的領域。別擔心你對編程是新手;我會成為你友好的導遊,一步一步地解釋一切。那麼,讓我們一起來看看吧!

PL/SQL - Transactions

什麼是交易?

在我們開始之前,讓我們先了解一下交易是什麼。想像你正在從你的儲蓄賬戶轉錢到你的支票賬戶。這個操作包含了兩個步驟:

  1. 從儲蓄賬戶中扣錢
  2. 向支票賬戶中加錢

這兩個步驟一起形成了一個交易。這很關鍵,因為我們希望兩個步驟都發生,或者兩個都不發生。我們不希望錢消失或從 thin air 中出現!

開始和結束一個交易

在 PL/SQL 中,當你執行第一個 DML(數據操作語言)語句時,交易會自動開始。這些包括 INSERT、UPDATE 和 DELETE 操作。讓我們看一個例子:

BEGIN
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1001, 'John', 'Doe');

UPDATE employees
SET salary = 50000
WHERE employee_id = 1001;
END;
/

在這個例子中,當 INSERT 語句被執行時,一個交易就開始了。交易會繼續進行 UPDATE 語句。

提交一個交易

現在你可能在想,“好,我們開始了一個交易,但我們怎麼結束它?”這個問題問得好!我們使用 COMMIT 語句來結束一個交易,並使所有變更永久化。讓我們修改我們之前的例子:

BEGIN
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1001, 'John', 'Doe');

UPDATE employees
SET salary = 50000
WHERE employee_id = 1001;

COMMIT;
END;
/

通過在結尾添加 COMMIT 語句,我們告訴數據庫,“是的,我對這些變更有把握。請將它們永久化。”

為什麼 COMMIT 很重要

想像你正在烤蛋糕。你已經混合了所有的原料,但除非你將它放入烤箱,否則它還不是真正的蛋糕。同樣,除非你 COMMIT 你的交易,否則數據庫中的變更不是永久性的。

回滾交易

有時候,事情並不如計劃那樣進行。也許你發現你在交易中犯了一個錯誤。別擔心!PL/SQL 給我們提供了一個安全網絡,叫做 ROLLBACK。這就像是你數據庫操作的“撤銷”按鈕。

BEGIN
UPDATE employees
SET salary = salary * 2;  -- 哎呀!我們並不是想給每個人的薪水加倍!

ROLLBACK;  -- 哈哈!危機解除了。
END;
/

在這個例子中,我們意外地將每個人的薪水加倍(這不是很棒嗎?)。但幸虧有 ROLLBACK,我們可以在變更變得永久之前撤銷這個變更。

自動交易控制

PL/SQL 在某些情況下也提供自動交易控制。讓我們看看這些場景的表格:

場景 行動
PL/SQL �塊正常結束 自動 COMMIT
交易過程中發生運行時錯誤 自動 ROLLBACK
SQL*Plus EXIT 指令(沒有 COMMIT) 自動 ROLLBACK
系統崩溃 自動 ROLLBACK

自動回滾的例子

BEGIN
UPDATE employees
SET salary = salary / 0;  -- 哎呀!除以零錯誤
END;
/

在這種情況下,PL/SQL 將由於運行時錯誤而自動回滾交易。

在你的交易中創建檢查點的保存點

有時候,你可能想要回滾交易的一部分,而不是全部。這時保存點就派上用場了。它們就像電子遊戲中的檢查點 - 如果事情變得糟糕,你可以回到它們。

BEGIN
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1002, 'Jane', 'Smith');

SAVEPOINT after_insert;

UPDATE employees
SET salary = 60000
WHERE employee_id = 1002;

-- 哎呀,我們改變了對薪水的想法
ROLLBACK TO after_insert;

COMMIT;
END;
/

在這個例子中,我們插入一個新員工並創建一個保存點。然後我們更新薪水,但決定回滾到保存點,撤銷薪水更新但保留插入。

使用交易的最佳實踐

  1. 保持交易短暫:長時間運行的交易可能會鎖定資源並影響系統性能。
  2. 使用顯式的 COMMIT 語句:雖然 PL/SQL 在某些情況下可以自動提交,但最好是明確你想要在什麼時候提交你的變更。
  3. 正確處理異常:確保包括正確的異常處理,以避免不當的提交或回滾。
  4. 對複雜交易使用保存點:如果你有一個長時間的交易,考慮使用保存點來允許部分回滾。

結論

那麼,各位,這就是 PL/SQL 交易的領域。我們從開始和結束交易,到提交和回滾,甚至創建保存點,都進行了一次旅行。記住,交易就像數據庫操作的安全帶 - 它們確保你的數據保持一致和可靠。

練習這些概念,嘗試不同的場景,很快你就能像專業人士一樣管理交易了。開心地編程,願你的交易總是 ACID(那是數據庫開玩笑的話,改天再說)!

Credits: Image by storyset