PostgreSQL事務


事務是對資料庫執行的工作單元。事務是以邏輯順序完成的工作的單位或順序,無論是使用者手動的方式還是通過某種資料庫程式自動執行。

事務性質

事務具有以下四個標準屬性,一般是由首字母縮寫詞ACID簡稱:

  • 原子性(Atomicity):確保工作單位內的所有操作成功完成; 否則事務將在故障點中止,以前的操作回滾到其以前的狀態。
  • 一致性(Consistency):確保資料庫在成功提交的事務時正確更改狀態。
  • 隔離性(Isolation):使事務能夠獨立運作並相互透明。
  • 永續性(Durability):確保在系統發生故障的情況下,提交的事務的結果或效果仍然存在。

事務控制

以下命令用於控制事務:

  • BEGIN TRANSACTION:開始事務。
  • COMMIT:儲存更改,或者您可以使用END TRANSACTION命令。
  • ROLLBACK:回滾更改。

事務控制命令僅用於DML命令INSERTUPDATEDELETE。 建立表或刪除它們時不能使用它們,因為這些操作會在資料庫中自動提交。

BEGIN TRANSACTION命令:

可以使用BEGIN TRANSACTION或簡單的BEGIN命令來開始事務。 這樣的事務通常會持續下去,直到遇到下一個COMMITROLLBACK命令。 但如果資料庫關閉或發生錯誤,則事務也將ROLLBACK

以下是啟動/開始事務的簡單語法:

BEGIN;

or

BEGIN TRANSACTION;

COMMIT命令

COMMIT命令是用於將事務呼叫的更改儲存到資料庫的事務命令。
COMMIT命令自上次的COMMITROLLBACK命令後將所有事務儲存到資料庫。
COMMIT命令的語法如下:

COMMIT;

or

END TRANSACTION;

ROLLBACK命令

ROLLBACK命令是用於還原尚未儲存到資料庫的事務的事務命令。自上次發出COMMITROLLBACK命令以來,ROLLBACK命令只能用於復原事務。
ROLLBACK命令的語法如下:

ROLLBACK;

範例

考慮COMPANY表有以下記錄:

 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000

現在,我們開始一個事務,並刪除表中age = 25的記錄,最後使用ROLLBACK命令撤消所有的更改。

yiibai_db=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;

如果再次檢視COMPANY表應該仍然看到以下記錄:

id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000

現在,讓我們開始另一個事務,並從表中刪除age = 25的記錄,最後使用COMMIT命令提交所有的更改。

yiibai_db=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;

如果檢視COMPANY表應該看到刪除後剩下的記錄:

 id | name  | age | address    | salary
----+-------+-----+------------+--------
  1 | Paul  |  32 | California |  20000
  3 | Teddy |  23 | Norway     |  20000
  5 | David |  27 | Texas      |  85000
  6 | Kim   |  22 | South-Hall |  45000
  7 | James |  24 | Houston    |  10000
(5 rows)