DBMS - 交易:理解基礎與進階

你好啊,未來的數據庫大師!我很興奮能帶你進入數據庫交易的迷人世界。作為你們親切鄰居的計算機科學老師,我看過無數學生為這個主題苦戰,但我保證,在這個教學結束時,你們將會成為交易專家!讓我們一起來探索吧!

DBMS - Transaction

什麼是交易?

在我們深入細節之前,讓我們從基礎開始。想像你正在ATM機上提款。你插入你的卡,輸入你的PIN碼,選擇金額,然後取現金。這整個過程,從開始到結束,就是一個交易。在數據庫術語中,交易是一系列作為單一邏輯工作單元的操作。

以下是一個交易在偽代碼中可能看起來的例子:

BEGIN TRANSACTION
READ balance FROM account WHERE id = 12345
IF balance >= 100 THEN
UPDATE account SET balance = balance - 100 WHERE id = 12345
DISPENSE 100 dollars
ELSE
DISPLAY "餘額不足"
END IF
COMMIT TRANSACTION

這個交易確保要么所有步驟都成功完成(錢被提取且餘額被更新),要么一個都不完成(如果錢不夠,什麼都不會改變)。

ACID屬性

現在,讓我們來討論所謂的交易四大支柱,即ACID屬性。這些對於在數據庫系統中維護數據的完整性和一致性至關重要。

原子性

原子性確保交易被視為一個單一的、不可分割的單元。這是全部或全無——交易中的所有操作要么全部成功完成,要么一個都不成功。

舉例:

BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 'Alice';
UPDATE accounts SET balance = balance + 100 WHERE id = 'Bob';
COMMIT;

如果交易中的任何部分失敗(例如,Bob的賬戶不存在),整個交易將會回滾,Alice的餘額將保持不變。

一貫性

一貫性確保交易將數據庫從一個有效狀態轉變為另一個有效狀態。它維護數據庫的完整性約束。

舉例: 假設我們有一個規則,要求所有賬戶的餘額必須是正數。

BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 200 WHERE id = 'Alice';
-- 如果Alice的餘額變為負數,交易將會中止
COMMIT;

隔離性

隔離性確保並發執行的交易使數據庫處於與串行執行交易相同的狀態。

舉例: 想像兩個並發運行的交易:

-- 交易1
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 'Alice';
-- 在這裡發生一些延遲
UPDATE accounts SET balance = balance + 100 WHERE id = 'Bob';
COMMIT;

-- 交易2
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE id = 'Alice';
COMMIT;

隔離性確保交易2將會看到Alice的餘額在轉賬之前或之後,但從不會在過程中。

持久性

持久性保證一旦交易提交,它將會持續存在,即使在電源故障、系統崩溃或錯誤發生時也是如此。

舉例: 在執行以下交易後:

BEGIN TRANSACTION;
INSERT INTO audit_log (action, timestamp) VALUES ('用戶登錄', CURRENT_TIMESTAMP);
COMMIT;

插入的記錄即使系統在之後立即崩溃也會持續存在。

可串行化

可串行化是交易之間隔離性的最高級別。它確保並發交易的執行結果與這些交易以某種順序串行執行所得的數據庫狀態相同。

讓我們看一個例子:

交易1: R(X), W(X)
交易2: R(X), W(X)

可能的串行調度:

  1. T1後接T2: R1(X), W1(X), R2(X), W2(X)
  2. T2後接T1: R2(X), W2(X), R1(X), W1(X)

如果並發調度的結果與這些串行調度中的一個等價,則該並發調度是可串行化的。

等價調度

兩個調度被認為等價,如果:

  1. 它們涉及相同集合的交易
  2. 它們以相同的方式對非中斷交易的衝突操作進行排序

讓我們看一個例子:

調度1: R1(X), R2(X), W1(X), W2(X) 調度2: R2(X), R1(X), W1(X), W2(X)

這些調度是等價的,因為它們的衝突操作(W1(X)和W2(X))在兩個調度中以相同的順序出現。

交易狀態

交易在其生命週期中會經過不同的狀態。以下是這些狀態的總結:

狀態 描述
活跃 初始狀態;交易在執行過程中會處於此狀態
部分提交 在最後一個語句執行後
失敗 發現正常執行無法繼續後
中斷 交易回滾後,數據庫恢復到交易開始前的狀態
提交 交易成功完成後

理解這些狀態對於有效管理交易和確保數據完整性至關重要。

總結來說,交易是數據庫管理系統中的一個基本概念,確保數據的一致性和完整性。通過理解ACID屬性、可串行化、等價調度和交易狀態,你已經踏上了成為數據庫專家的道路!

記住,熟能生巧。嘗試在真實的數據庫系統中實現這些概念,你將會看到交易有多麼強大。祝你好運,未來的數據庫管理員!

Credits: Image by storyset