MySQL事務(TRANSACTION)

2020-07-16 10:04:45
MySQL 資料庫中事務是使用者一系列的資料庫操作序列,這些操作要麼全做要麼全不做,是一個不可分割的工作單位。

為什麼要使用事務

事務具有 4 個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續性(Durability)。這 4 個特性簡稱為 ACID 特性。

1) 原子性

事務必須是原子工作單元,事務中的操作要麼全部執行,要麼全都不執行,不能只完成部分操作。原子性在資料庫系統中,由恢復機制來實現。

2) 一致性

事務開始之前,資料庫處於一致性的狀態;事務結束後,資料庫必須仍處於一致性狀態。資料庫一致性的定義是由使用者負責的。例如,在銀行轉賬中,使用者可以定義轉賬前後兩個賬戶金額之和保持不變。

3) 隔離性

系統必須保證事務不受其他並行執行事務的影響,即當多個事務同時執行時,各事務之間相互隔離,不可互相干擾。事務檢視資料時所處的狀態,要麼是另一個並行事務修改它之前的狀態,要麼是另一個並行事務修改它之後的狀態,事務不會檢視中間狀態的資料。隔離性通過系統的並行控制機制實現。

4) 永續性

一個已完成的事務對資料所做的任何變動在系統中是永久有效的,即使該事務產生的修改不正確,錯誤也將一直保持。永續性通過恢復機制實現,發生故障時,可以通過紀錄檔等手段恢復資料庫資訊。

事務的 ACID 原則保證了一個事務或者成功提交,或者失敗回滾,二者必居其一。因此,它對事務的修改具有可恢復性。即當事務失敗時,它對資料的修改都會恢復到該事務執行前的狀態。

開始事務

事務以 BEGIN TRANSACTION 開始。

語法格式如下:

BEGIN TRANSACTION <事務名稱> |@<事務變數名稱>

語法說明如下:
  • @<事務變數名稱>是由使用者定義的變數,必須用 char、varchar、nchar 或 nvarchar資料型別來宣告該變數。
  • BEGIN TRANSACTION 語句的執行使全域性變數 @@TRANCOUNT 的值加 1。

提交事務

COMMIT 表示提交事務,即提交事務的所有操作。具體地說,就是將事務中所有對資料庫的更新寫回到磁碟上的物理資料庫中,事務正常結束。

提交事務,意味著將事務開始以來所執行的所有資料修改成為資料庫的永久部分,因此也標誌著一個事務的結束。一旦執行了該命令,將不能回滾事務。只有在所有修改都準備好提交給資料庫時,才執行這一操作。

語法格式如下:

COMMIT TRANSACTION <事務名稱> |@<事務變數名稱>

其中:COMMIT TRANSACTION語句的執行使全域性變數 @@TRANCOUNT 的值減 1。

復原事務

ROLLBACK 表示復原事務,即在事務執行的過程中發生了某種故障,事務不能繼續執行,系統將事務中對資料庫的所有已完成的操作全部復原,回滾到事務開始時的狀態。這裡的操作指對資料庫的更新操作。

當事務執行過程中遇到錯誤時,使用 ROLLBACK TRANSACTION 語句使事務回滾到起點或指定的保持點處。同時,系統將清除自事務起點或到某個儲存點所做的所有的資料修改,並且釋放由事務控制的資源。因此,這條語句也標誌著事務的結束。

語法格式如下:

ROLLBACK [TRANSACTION]
[<事務名稱>| @<事務變數名稱> | <儲存點名稱>| @ <含有儲存點名稱的變數名>

語法說明如下:
  • 當條件回滾只影響事務的一部分時,事務不需要全部復原已執行的操作。可以讓事務回滾到指定位置,此時,需要在事務中設定儲存點(SAVEPOINT)。儲存點所在位置之前的事務語句不用回滾,即儲存點之前的操作被視為有效的。儲存點的建立通過“SAVING TRANSACTION<儲存點名稱>”語句來實現,再執行“ROLLBACK TRANSACTION<儲存點名稱>”語句回滾到該儲存點。
  • 若事務回滾到起點,則全域性變數 @@TRANCOUNT 的值減 1;若事務回滾到指定的儲存點,則全域性變數 @@TRANCOUNT 的值不變。