事務是一個工作單元,對數據庫執行。事務是在一個邏輯順序,無論是由用戶手動或某種數據庫程序自動完成的工作單位或序列。
事務是指一個或多個更改數據庫的傳播。例如,如果正在創建一個記錄或更新記錄從表中刪除一條記錄,那麼正在執行的事務放在表中。重要的是要控制事務,以確保數據的完整性和處理數據庫錯誤。
實際上,可以使用多台PostgreSQL查詢成一組,執行所有這些放在一起作為一個事務的一部分。
事務具有以下四個標准屬性的縮寫ACID,通常被稱為:
原子性: 確保工作單位內的所有操作都成功完成,否則,該事務所被中止在故障點,和以前的操作將回滾到以前的狀態。
一致性: 確保數據庫正確地改變狀態後成功提交的事務。
隔離性: 使交易操作相互獨立的和透明的。
持久性: 確保已提交事務的結果或效果在系統發生故障的情況下仍然存在。
使用下面的命令來控制事務:
BEGIN TRANSACTION: 開始事務.
COMMIT: 保存更改,或者可以使用END TRANSACTION命令.
ROLLBACK: 回滾事務。
事務控制命令只用來與DML命令INSERT,UPDATE和DELETE。他們不能使用創建表時或刪除,因為這些操作在數據庫中被自動提交.
事務可以啟動或簡單BEGIN...BEGIN TRANSACTION命令。事務通常會繼續下去,直到遇到下一個COMMIT或ROLLBACK命令。不過如果數據庫被關閉或發生錯誤事務也將回滾。
以下是簡單的語法來啟動一個事務:
BEGIN; or BEGIN TRANSACTION;
COMMIT命令是用來將更改保存到數據庫中的事務調用事務命令。
COMMIT命令保存到數據庫的所有事務自上次COMMIT或ROLLBACK命令。
COMMIT命令的語法如下:
COMMIT; or END TRANSACTION;
ROLLBACK命令是用於撤消交易尚未保存到數據庫的事務命令。
ROLLBACK命令只能用於自上次發出COMMIT或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命令撤消所有的變化。
testdb=# 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命令提交的所有更改。
testdb=# 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)