sqlite 事務
事務(transaction)是一個對數據庫執(zhí)行工作單元。事務(transaction)是以邏輯順序完成的工作單位或序列,可以是由用戶手動操作完成,也可以是由某種數據庫程序自動完成。
事務(transaction)是指一個或多個更改數據庫的擴展。例如,如果您正在創(chuàng)建一個記錄或者更新一個記錄或者從表中刪除一個記錄,那么您正在該表上執(zhí)行事務。重要的是要控制事務以確保數據的完整性和處理數據庫錯誤。
實際上,您可以把許多的 sqlite 查詢聯合成一組,把所有這些放在一起作為事務的一部分進行執(zhí)行。
1. 事務的屬性
事務(transaction)具有以下四個標準屬性,通常根據首字母縮寫為 acid:
- 原子性(atomicity):確保工作單位內的所有操作都成功完成,否則,事務會在出現故障時終止,之前的操作也會回滾到以前的狀態(tài)。
- 一致性(consistency):確保數據庫在成功提交的事務上正確地改變狀態(tài)。
- 隔離性(isolation):使事務操作相互獨立和透明。
- 持久性(durability):確保已提交事務的結果或效果在系統(tǒng)發(fā)生故障的情況下仍然存在。
2. 事務控制
使用下面的命令來控制事務:
- begin transaction:開始事務處理。
- commit:保存更改,或者可以使用 end transaction 命令。
- rollback:回滾所做的更改。
事務控制命令只與 dml 命令 insert、update 和 delete 一起使用。他們不能在創(chuàng)建表或刪除表時使用,因為這些操作在數據庫中是自動提交的。
3. begin transaction 命令
事務(transaction)可以使用 begin transaction 命令或簡單的 begin 命令來啟動。此類事務通常會持續(xù)執(zhí)行下去,直到遇到下一個 commit 或 rollback 命令。不過在數據庫關閉或發(fā)生錯誤時,事務處理也會回滾。以下是啟動一個事務的簡單語法:
begin; or begin transaction;
4. commit 命令
commit 命令是用于把事務調用的更改保存到數據庫中的事務命令。
commit 命令把自上次 commit 或 rollback 命令以來的所有事務保存到數據庫。
commit 命令的語法如下:
commit; or end transaction;
5. rollback 命令
rollback 命令是用于撤消尚未保存到數據庫的事務的事務命令。
rollback 命令只能用于撤銷自上次發(fā)出 commit 或 rollback 命令以來的事務。
rollback 命令的語法如下:
rollback;
6. 范例
假設 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