跳至內容

PostgreSQL/事務

來自華夏公益教科書,開放的書本,開放的世界


所有更改資料的操作,如 INSERTUPDATEDELETE,必須在稱為 TRANSACTION 的周圍結構內執行。事務使用 SQL 命令 BEGIN 建立,並使用 COMMITROLLBACK 完成。在事務的生命週期中,對資料庫的更改僅初步寫入。最後,COMMIT 正式完成事務並提交所有預期的資料更改,或者 ROLLBACK 終止事務並恢復所有這些初步更改。

除了顯式使用 SQL 關鍵字來管理事務之外,PostgreSQL 的一些客戶端庫會在資料更改操作未在顯式建立的事務中執行的情況下隱式建立一個新事務。在這種情況下,操作會在執行後立即自動提交。

BEGIN; -- establish a new transaction
UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
COMMIT; -- finish the transaction

-- this UPDATE runs as the only command of an implicitly created transaction ...
UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice';

-- ... and this one runs in another transaction
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
提示:在過程或函式中工作時,有一個 DECLARE ... BEGIN ... END; 結構來定義 '塊'。在這種情況下,BEGIN 的含義(BEGIN 後面沒有分號!)與這裡解釋的不同。您可以在事務上下文中使用關鍵字 START TRANSACTION; 作為 BEGIN; 的替代方案來避免歧義。除此之外,START TRANSACTION; 符合 SQL 標準。

事務為應用程式提供了極大的便利。特別是對於必須將許多語句作為一個一致的單元執行的業務邏輯(例如上述從一個銀行帳戶到另一個銀行帳戶的轉賬),無需在事務執行過程中發生錯誤後採取單獨的行動。在許多情況下,只需重新啟動事務或以統一的方式處理錯誤即可。

PostgreSQL 中的事務保證了 ACID 原則的所有要求都得到滿足,請參閱下一章

子事務

[編輯 | 編輯原始碼]

在事務中,關鍵字 SAVEPOINT 定義並表示一個位置,事務可以回滾到該位置。

-- The transaction will insert the values 1 and 3, but not 2.
BEGIN;
INSERT INTO my_table VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO my_table VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO my_table VALUES (3);
COMMIT;


華夏公益教科書