SQLite - 事務



事務是對資料庫執行的一組工作單元。事務是按邏輯順序完成的工作單元或序列,無論是使用者手動執行還是由某種資料庫程式自動執行。

事務是對資料庫進行的一個或多個更改的傳播。例如,如果您正在建立、更新或從表中刪除記錄,那麼您就是在對錶執行事務。控制事務對於確保資料完整性和處理資料庫錯誤非常重要。

實際上,您會將許多 SQLite 查詢組合成一個組,並將它們作為一個事務一起執行。

事務的特性

事務具有以下四個標準特性,通常用首字母縮寫詞 ACID 來表示。

  • 原子性 - 確保工作單元中的所有操作都成功完成;否則,事務將在發生故障時中止,並且之前的操作將回滾到其以前的狀態。

  • 一致性 - 確保資料庫在成功提交事務後正確地更改狀態。

  • 隔離性 - 使事務能夠獨立於彼此並對其透明地執行。

  • 永續性 - 確保已提交事務的結果或效果在系統發生故障時仍然存在。

事務控制

以下是用於控制事務的命令

  • BEGIN TRANSACTION - 開始事務。

  • COMMIT - 儲存更改,或者您可以使用END TRANSACTION命令。

  • ROLLBACK - 回滾更改。

事務控制命令僅與 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。在建立或刪除表時不能使用它們,因為這些操作會自動提交到資料庫中。

BEGIN 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

現在,讓我們啟動一個事務並刪除表中年齡等於 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

讓我們啟動另一個事務並刪除表中年齡等於 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
廣告