SQL - Transactions:初學者指南

你好,未來的數據庫大師!今天,我們將踏上一段令人興奮的旅程,進入 SQL 事務的世界。別擔心如果你從來沒有寫過一行代碼——我將成為你的友好指南,我們將一起逐步探索這個主題。所以,來一杯咖啡(或者如果你喜歡,一杯茶),讓我們一起深入探討吧!

SQL - Transactions

SQL Transactions 是什麼?

想像一下你在 ATM 柜員機上從你的賬戶中提取現金。這個過程涉及多個步驟:檢查你的餘額、扣除金額以及發放現金。現在,如果機器在過程中間出現故障怎麼辦?你肯定不希望丟失你的錢,對吧?這就是事務派上用場的地方!

在 SQL 中,事務是一系列被當作單一工作單元的操作。它就像是你數據庫操作的保護罩,確保它們要么全部成功,要么全部不成功。這樣,你的數據就能保持一致和可靠。

讓我們看一個簡單的例子:

BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 456;
COMMIT;

在這個事務中,我們將 100 美元從一個賬戶轉移到另一個賬戶。BEGIN TRANSACTION 标記我們事務的開始,而 COMMIT 則是事務的結束。如果在這兩點之間有任何問題,整個事務都可以撤銷,以保持我們賬戶的平衡。

事務的屬性

事務有四個關鍵屬性,通常記憶為 ACID 的縮寫。讓我們來分解它們:

原子性

原子性確保事務被當作一個單一的、不可分割的單位。它是全部或無——事務中的所有操作要么全部成功,要么全部不成功。

一貫性

一貫性保證事務將數據庫從一個有效狀態帶到另一個有效狀態。這就像確保無論你進行多少次購買,你的錢包中總是有正確的金額。

隔離性

隔離性將事務相互隔離。這就像在共享房屋中擁有自己的私人房間——在你的事務中發生的事情在事務完成之前都會保留在事務中。

持久性

持久性確保一旦事務被提交,它就會保持提交狀態。這就像在樹上刻下你的名字——即使有風暴,它們也會一直在那裡。

事務控制命令

現在,我們了解了事務是什麼以及它們為什麼重要,讓我們來看看我們用來控制它們的命令。我會以一個方便的表格形式呈現這些命令,以便於參考:

命令 描述
BEGIN TRANSACTION 開始一個新的事務
COMMIT 儲存事務中進行的更改
ROLLBACK 撤銷事務中進行的更改
SAVEPOINT 在事務中創建一個可以之後回滾到的點
RELEASE SAVEPOINT 在事務中移除一個保存點
SET TRANSACTION 指定事務的特徵

讓我們詳細探索每一個!

COMMIT 命令

COMMIT 命令就像在電子遊戲中點擊 "保存" 按鈕。它確定了事務中所有更改的保存。以下是如何使用它:

BEGIN TRANSACTION;
INSERT INTO students (name, age) VALUES ('Alice', 20);
UPDATE courses SET available_seats = available_seats - 1 WHERE course_id = 101;
COMMIT;

在這個例子中,我們將 Alice 選課。我們將她添加到學生表中並減少可用的座位數。事務結尾的 COMMIT 使這些更改成為永久的。

ROLLBACK 命令

ROLLBACK 是你的 "撤銷" 按鈕。如果在事務中出現問題,你可以使用 ROLLBACK 取消所有更改並返回到事務開始前的狀態。

BEGIN TRANSACTION;
DELETE FROM students WHERE name = 'Bob';
-- 哎呀!我們並不是要刪除 Bob!
ROLLBACK;

在這裡,我們意外地從我們的學生表中刪除了 Bob。但是別擔心!ROLLBACK 命令會挽救局面,通過撤銷刪除操作。

SAVEPOINT 命令

SAVEPOINT 像是在你的事務中創建一個檢查點。你可以創建多個保存點,并在需要時回滾到其中的任何一個。

BEGIN TRANSACTION;
INSERT INTO courses (course_name, instructor) VALUES ('SQL 101', 'Prof. Smith');
SAVEPOINT new_course;

UPDATE instructors SET courses_taught = courses_taught + 1 WHERE name = 'Prof. Smith';
-- 哎呀!Prof. Smith 這個學期休假
ROLLBACK TO new_course;

UPDATE instructors SET courses_taught = courses_taught + 1 WHERE name = 'Prof. Johnson';
COMMIT;

在這個例子中,我們在添加新課程後創建了一個保存點。當我們意識到我們分配了錯誤的講師時,我們可以回滾到保存點並進行正確的更新。

RELEASE SAVEPOINT 命令

RELEASE SAVEPOINT 命令移除你不再需要的保存點。這就像在遊戲中清除一個檢查點,當你知道你不再需要回到它時。

BEGIN TRANSACTION;
SAVEPOINT update_start;
UPDATE products SET price = price * 1.1;
-- 價格上調成功,我們不再需要保存點
RELEASE SAVEPOINT update_start;
COMMIT;

在這裡,我們在更新產品價格之前創建了一個保存點。一旦我們確定更新是正確的,我們就釋放保存點,因為我們不再需要它。

SET TRANSACTION 命令

SET TRANSACTION 命令允許你為事務指定特徵,如隔離級別或讀取狀態。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
SELECT * FROM sensitive_data;
COMMIT;

在這個例子中,我們在開始事務之前將事務隔離級別設置為 "READ COMMITTED"。這樣可以確保我們只讀取其他事務已經提交的數據,幫助防止汙染讀取。

至於你們,各位!我們已經穿越了 SQL 事務的土地,從理解它們是什麼到掌握控制它們的命令。記住,熟能生巧,所以不要害怕在安全、測試環境中嘗試這些概念。

事務可能起初看起來有點抽象,但它們就像是數據庫世界的安全網。它們保證我們的數據一致和應用程序可靠。所以下次你在工作數據庫項目時,記得將重要操作包裝在事務中——你未來的自己(和你的用戶)會感謝你的!

快樂編程,願你的事務總是能成功提交!

Credits: Image by storyset