TRANSACTION(事務)是資料庫管理系統執行過程中的一個邏輯機關,由一個有限的資料庫操作序列構成。
資料庫事務通常包含了一個序列的對資料庫的讀/寫操作。包含有以下兩個目的:
為資料庫操作序列提供了一個從失敗中恢複到正常狀态的方法,同時提供了資料庫即使在異常狀态下仍能保持一緻性的方法。
當多個應用程式在并發通路資料庫時,可以在這些應用程式之間提供一個隔離方法,以防止彼此的操作互相幹擾。
當事務被送出給了資料庫管理系統(DBMS),則 DBMS 需要確定該事務中的所有操作都成功完成且其結果被永久儲存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要復原,回到事務執行前的狀态;同時,該事務對資料庫或者其他事務的執行無影響,所有的事務都好像在獨立的運作。
事務的屬性
事務具有以下四個标準屬性,通常根據首字母縮寫為 ACID:
原子性(Atomicity):事務作為一個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行。
一緻性(Consistency):事務應確定資料庫的狀态從一個一緻狀态轉變為另一個一緻狀态。一緻狀态的含義是資料庫中的資料應滿足完整性限制。
隔離性(Isolation):多個事務并發執行時,一個事務的執行不應影響其他事務的執行。
持久性(Durability):已被送出的事務對資料庫的修改應該永久儲存在資料庫中。
例子
某人要在商店使用電子貨币購買100元的東西,當中至少包括兩個操作:
該人賬戶減少 100 元。
商店賬戶增加100元。
支援事務的資料庫管理系統就是要確定以上兩個操作(整個"事務")都能完成,或一起取消,否則就會出現 100 元平白消失或出現的情況。
事務控制
使用下面的指令來控制事務:
BEGIN TRANSACTION:開始一個事務。
COMMIT:事務确認,或者可以使用 END TRANSACTION 指令。
ROLLBACK:事務復原。
事務控制指令隻與 INSERT、UPDATE 和 DELETE 一起使用。他們不能在建立表或删除表時使用,因為這些操作在資料庫中是自動送出的。
BEGIN TRANSACTION 指令
事務可以使用 BEGIN TRANSACTION 指令或簡單的 BEGIN 指令來啟動。此類
手遊轉讓平台事務通常會持續執行下去,直到遇到下一個 COMMIT 或 ROLLBACK 指令。不過在資料庫關閉或發生錯誤時,事務處理也會復原。以下是啟動一個事務的簡單文法:
BEGIN;
或者
BEGIN TRANSACTION;
COMMIT 指令
COMMIT 指令是用于把事務調用的更改儲存到資料庫中的事務指令,即确認事務。
COMMIT 指令的文法如下:
COMMIT;
END TRANSACTION;
ROLLBACK 指令
ROLLBACK 指令是用于撤消尚未儲存到資料庫的事務指令,即復原事務。
ROLLBACK 指令的文法如下:
ROLLBACK;
執行個體
建立 COMPANY 表(下載下傳 COMPANY SQL 檔案 ),資料内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary |
---|---|---|---|---|
1 | Paul | 32 | California | 20000 |
2 | Allen | 25 | Texas | 15000 |
3 | Teddy | 23 | Norway | |
4 | Mark | Rich-Mond | 65000 | |
5 | David | 27 | 85000 | |
6 | Kim | 22 | South-Hall | 45000 |
7 | James | 24 | Houston | 10000 |
(7 rows)
現在,讓我們開始一個事務,并從表中删除 age = 25 的記錄,最後,我們使用 ROLLBACK 指令撤消所有的更改。
runoobdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
檢查 COMPANY 表,仍然有以下記錄:
現在,讓我們開始另一個事務,從表中删除 age = 25 的記錄,最後我們使用 COMMIT 指令送出所有的更改。
檢查 COMPANY 表,記錄已被删除:
(5 rows)