事務(wù)是針對數(shù)據(jù)庫執(zhí)行的工作單元。事務(wù)是以邏輯順序完成的單位或工作順序,無論是由用戶手動完成還是由某種數(shù)據(jù)庫程序自動完成。
事務(wù)是將一個或多個更改傳播到數(shù)據(jù)庫。例如,如果您要在表中創(chuàng)建,更新或刪除記錄,那么您將在表上執(zhí)行事務(wù)??刂剖聞?wù)以確保數(shù)據(jù)完整性和處理數(shù)據(jù)庫錯誤很重要。
實際上,您會將許多SQLite查詢組成一個組,并將它們作為事務(wù)的一部分一起執(zhí)行。
事務(wù)具有以下四個標(biāo)準(zhǔn)屬性,通常由首字母縮寫ACID指代。
原子性(Atomicity):確保工作單位內(nèi)的所有操作都成功完成,否則,事務(wù)會在出現(xiàn)故障時終止,之前的操作也會回滾到以前的狀態(tài)。
一致性(Consistency):確保數(shù)據(jù)庫在成功提交的事務(wù)上正確地改變狀態(tài)。
隔離性(Isolation):使事務(wù)操作相互獨立和透明。
持久性(Durability):確保已提交事務(wù)的結(jié)果或效果在系統(tǒng)發(fā)生故障的情況下仍然存在。
以下是用于控制事務(wù)的以下命令:
BEGIN TRANSACTION ?開始事務(wù)。
COMMIT?要保存更改,也可以使用END TRANSACTION命令。
ROLLBACK ?回滾更改。
事務(wù)控制命令只與 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他們不能在創(chuàng)建表或刪除表時使用,因為這些操作在數(shù)據(jù)庫中是自動提交的。
可以使用BEGIN TRANSACTION或簡單地使用BEGIN命令來啟動事務(wù)。這樣的事務(wù)通常會持續(xù)到遇到下一個COMMIT或ROLLBACK命令為止。但是,如果數(shù)據(jù)庫關(guān)閉或發(fā)生錯誤,則事務(wù)也將回滾。以下是啟動事務(wù)的簡單語法。
BEGIN; or BEGIN TRANSACTION;
COMMIT命令是用于將事務(wù)調(diào)用的更改保存到數(shù)據(jù)庫的事務(wù)性命令。
自上一個COMMIT或ROLLBACK命令以來,COMMIT命令將所有事務(wù)保存到數(shù)據(jù)庫中。
以下是COMMIT命令的語法。
COMMIT; or END TRANSACTION;
ROLLBACK命令是用于撤消尚未保存到數(shù)據(jù)庫的事務(wù)的事務(wù)性命令。
自上次發(fā)出COMMIT或ROLLBACK命令以來,ROLLBACK命令只能用于撤消事務(wù)。
以下是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
現(xiàn)在,讓我們開始一個事務(wù)并從age = 25的表中刪除記錄。然后,使用ROLLBACK命令撤消所有更改。
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> ROLLBACK;
現(xiàn)在,如果您檢查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
讓我們開始另一個事務(wù),并從AGE= 25的表中刪除記錄,最后我們使用COMMIT命令來提交所有更改。
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> COMMIT;
如果現(xiàn)在檢查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