PL/SQL - 交易:初學者指南
您好,未來的數據庫大師!今天,我們將踏上一段令人興奮的旅程,進入 PL/SQL 交易的領域。別擔心你對編程是新手;我會成為你友好的導遊,一步一步地解釋一切。那麼,讓我們一起來看看吧!
什麼是交易?
在我們開始之前,讓我們先了解一下交易是什麼。想像你正在從你的儲蓄賬戶轉錢到你的支票賬戶。這個操作包含了兩個步驟:
- 從儲蓄賬戶中扣錢
- 向支票賬戶中加錢
這兩個步驟一起形成了一個交易。這很關鍵,因為我們希望兩個步驟都發生,或者兩個都不發生。我們不希望錢消失或從 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;
/
在這個例子中,我們插入一個新員工並創建一個保存點。然後我們更新薪水,但決定回滾到保存點,撤銷薪水更新但保留插入。
使用交易的最佳實踐
- 保持交易短暫:長時間運行的交易可能會鎖定資源並影響系統性能。
- 使用顯式的 COMMIT 語句:雖然 PL/SQL 在某些情況下可以自動提交,但最好是明確你想要在什麼時候提交你的變更。
- 正確處理異常:確保包括正確的異常處理,以避免不當的提交或回滾。
- 對複雜交易使用保存點:如果你有一個長時間的交易,考慮使用保存點來允許部分回滾。
結論
那麼,各位,這就是 PL/SQL 交易的領域。我們從開始和結束交易,到提交和回滾,甚至創建保存點,都進行了一次旅行。記住,交易就像數據庫操作的安全帶 - 它們確保你的數據保持一致和可靠。
練習這些概念,嘗試不同的場景,很快你就能像專業人士一樣管理交易了。開心地編程,願你的交易總是 ACID(那是數據庫開玩笑的話,改天再說)!
Credits: Image by storyset