SQLite 事務(Transaction)
事務(Transaction)是一個對數據庫執行工作單元。事務(Transaction)是以邏輯順序完成的工作單位或序列,可以是由用戶手動操作完成,也可以是由某種資料庫程式自動完成。
事務(Transaction)是指一個或多個更改資料庫的擴展。例如,如果您正在創建一個記錄或者更新一個記錄或者從表中刪除一個記錄,那麼您正在該表上執行事務。重要的是要控制事務以確保數據的完整性和處理資料庫錯誤。
實際上,您可以把許多的 SQLite 查詢聯合成一組,把所有這些放在一起作為事務的一部分進行執行。
事務的屬性
事務(Transaction)具有以下四個標準屬性,通常根據首字母縮寫為 ACID:
原子性(Atomicity):確保工作單位內的所有操作都成功完成,否則,事務會在出現故障時終止,之前的操作也會回滾到以前的狀態。
一致性(Consistency):確保資料庫在成功提交的事務上正確地改變狀態。
隔離性(Isolation):使事務操作相互獨立和透明。
持久性(Durability):確保已提交事務的結果或效果在系統發生故障的情況下仍然存在。
事務控制
使用下麵的命令來控制事務:
BEGIN TRANSACTION:開始事務處理。
COMMIT:保存更改,或者可以使用 END TRANSACTION 命令。
ROLLBACK:回滾所做的更改。
事務控制命令只與 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他們不能在創建表或刪除表時使用,因為這些操作在資料庫中是自動提交的。
BEGIN TRANSACTION 命令
事務(Transaction)可以使用 BEGIN TRANSACTION 命令或簡單的 BEGIN 命令來啟動。此類事務通常會持續執行下去,直到遇到下一個 COMMIT 或 ROLLBACK 命令。不過在資料庫關閉或發生錯誤時,事務處理也會回滾。以下是啟動一個事務的簡單語法:
BEGIN; or BEGIN TRANSACTION;
COMMIT 命令
COMMIT 命令是用於把事務調用的更改保存到資料庫中的事務命令。
COMMIT 命令把自上次 COMMIT 或 ROLLBACK 命令以來的所有事務保存到資料庫。
COMMIT 命令的語法如下:
COMMIT; or END TRANSACTION;
ROLLBACK 命令
ROLLBACK 命令是用於撤銷尚未保存到資料庫的事務的事務命令。
ROLLBACK 命令只能用於撤銷自上次發出 COMMIT 或 ROLLBACK 命令以來的事務。
ROLLBACK 命令的語法如下:
ROLLBACK;
實例
假設 COMPANY 表有以下記錄:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
現在,讓我們開始一個事務,並從表中刪除 age = 25 的記錄,最後,我們使用 ROLLBACK 命令撤銷所有的更改。
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> ROLLBACK;
檢查 COMPANY 表,仍然有以下記錄:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
現在,讓我們開始另一個事務,從表中刪除 age = 25 的記錄,最後我們使用 COMMIT 命令提交所有的更改。
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> COMMIT;
檢查 COMPANY 表,有以下記錄:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0