SQL基礎知識——事務

什麼是事務

事務是在數據庫上按照一定的邏輯順序執行的任務序列,既可以由用戶手動執行,也可以由某種數據庫程序自動執行。

事務實際上就是對數據庫的一個或者多個更改。當你在某張表上創建更新或者刪除記錄的時,你就已經在使用事務了。控制事務以保證數據完整性,並對數據庫錯誤做出處理,對數據庫來說非常重要。

實踐中,通常會將很多 SQL 查詢組合在一起,並將其作為某個事務一部分來執行。

事務的屬性

事務具有以下四個標準屬性,通常用縮略詞 ACID 來表示:

原子性:保證任務中的所有操作都執行完畢;否則,事務會在出現錯誤時終止,並回滾之前所有操作到原始狀態。

一致性:如果事務成功執行,則數據庫的狀態得到了進行了正確的轉變。

隔離性:

保證不同的事務相互獨立、透明地執行。

持久性:即使出現系統故障,之前成功執行的事務的結果也會持久存在。

事務控制

有四個命令用於控制事務:

COMMIT:提交更改;

ROLLBACK:回滾更改;

SAVE:在事務內部創建一系列可以 ROLLBACK 的還原點;

SET TRANSACTION:命名事務;

COMMIT 命令

COMMIT 命令用於保存事務對數據庫所做的更改。

COMMIT 命令會將自上次 COMMIT 命令或者 ROLLBACK 命令執行以來所有的事務都保存到數據庫中。

COMMIT 命令的語法如下所示:

COMMIT;


COMMIT事務實例

考慮 Customers表,表中的記錄如下所示:

SQL基礎知識——事務


下面的示例將會刪除表中姓名為"張三"的記錄,然後將更改提交(COMMIT)到數據庫中。

BEGIN TRANSACTION
DELETE FROM customers_bak WHERE 姓名='張三'
COMMIT;

上述語句將會從表中刪除一行記錄,再執行 SELECT 語句將會得到如下結果:

SQL基礎知識——事務


注意:SQL Server默認會自動提交事務,要取消自動提交事務可以執行如下操作,在SSMS中的菜單欄中選擇【工具】——【選項】——【查詢執行】——【ANSI】在界面右邊勾選上SET IMPLICIT_TRANSACTIONS,如下圖:

SQL基礎知識——事務


設置完後需重新啟動SMSS方可生效。

ROLLBACK 命令

ROLLBACK 命令用於撤銷尚未保存到數據庫中的事務。

ROLLBACK 命令只能撤銷自上次 COMMIT 命令或者 ROLLBACK 命令執行以來的事務。

ROLLBACK 命令的語法如下所示:

ROLLBACK;


ROLLBACK示例

考慮 Customers表,表中的記錄如下所示:

SQL基礎知識——事務


下面的示例將會從表中刪除城市為"廣州"的記錄,然後回滾(ROLLBACK)對數據庫所做的更改。

BEGIN TRANSACTION
DELETE FROM Customers WHERE 城市='廣州'
ROLLBACK;

結果是刪除操作並不會對數據庫產生影響。現在,執行 SELECT 語句將會得到如下結果:

SQL基礎知識——事務


SAVE命令

SAVE 是事務中的一個狀態點,使得我們可以將事務回滾至特定的點,而不是將整個事務都撤銷。

SAVE 命令的記錄如下所示:

SAVE TRANSACTION SAVE_NAME;

該命令只能在事務語句之間創建保存點(SAVE)。ROLLBACK 命令可以用於撤銷一系列的事務。

回滾至某一保存點的語法如下所示:

ROLLBACK TRANSACTION SAVE_NAME

下面的示例中,你計劃從 Customers表中刪除三條不同的記錄,並在每次刪除之前創建一個保存點(SAVE),從而使得你可以在任何任何時候回滾到任意的保存點,以恢復數據至其原始狀態。

注意:Oracle和Mysql的保存點語法與上述不同,語法為

SVAEPOINT SAVEPOINT_NAME


SAVE示例

考慮 Customers 表,表中的記錄如下所示:

SQL基礎知識——事務


操作序列如下所示:

BEGIN TRANSACTION
SAVE TRANSACTION SP1
DELETE FROM Customers WHERE 姓名='張三'
SAVE TRANSACTION SP2
DELETE FROM Customers WHERE 姓名='李四'
SAVE TRANSACTION SP3
DELETE FROM Customers WHERE 姓名='王五'

現在,三次刪除操作已經生效了,如果此時你改變主意決定回滾至名字為 SP2 的保存點,由於 SP2 於第一次刪除操作之後創建,所以後兩次刪除操作將會被撤銷。

ROLLBACK TRANSACTION SP2
COMMIT;

注意,由於你將數據庫回滾至 SP2,所以只有第一次刪除真正起效了:

SQL基礎知識——事務


SET TRANSACTION 命令

SET TRANSACTION 命令可以用來初始化數據庫事務,指定隨後的事務的各種特徵。

例如,你可以將某個事務指定為只讀或者讀寫。

SET TRANSACTION 命令的語法如下所示:

SET TRANSACTION [ READ WRITE | READ ONLY ];


批註

事務在SQL應用中很廣泛,特別是針對一些讀寫問題時,使用事務可以很好的規避意外(髒讀,幻讀,不可重複讀)。而且事務在出來誤操作時也有很好的預防作用,特別是像SQL Server這種自動提交的數據庫平臺,使用事務能防止誤刪和誤更新。


分享到:


相關文章: