首頁 > mysql教程 閱讀:0更新時間:2020-03-28 04:09:27

MySQL事務(TRANSACTION)

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]
[<事務名稱>| @<事務變量名稱> | <存儲點名稱>| @ <含有存儲點名稱的變量名>

語法說明如下:
  • 當條件回滾只影響事務的一部分時,事務不需要全部撤銷已執行的操作??梢宰屖聞栈貪L到指定位置,此時,需要在事務中設定保存點(SAVEPOINT)。保存點所在位置之前的事務語句不用回滾,即保存點之前的操作被視為有效的。保存點的創建通過“SAVING TRANSACTION<保存點名稱>”語句來實現,再執行“ROLLBACK TRANSACTION<保存點名稱>”語句回滾到該保存點。
  • 若事務回滾到起點,則全局變量 @@TRANCOUNT 的值減 1;若事務回滾到指定的保存點,則全局變量 @@TRANCOUNT 的值不變。

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

国产亚洲欧美日韩