【MySQL】(七)事務

我的個人博客 http://www.haxianhe.com/

數據庫系統引入事務的主要目的:事務會把數據庫從一種狀態轉換爲另一種一致狀態。在數據庫提交工作時,可以確保要麼所有修改都已經保存了,要麼所有修改都不保存。
InnoDB存儲引擎中的事務完全符合ACID特性。ACID是以下4個詞的縮寫:
原子性(atomicity)
一致性(consistency)
隔離性(isolation)
持久性(durability)
本篇文章主要關注事務的原子性這一概念,並說明怎樣正確使用事務及編寫正確的應用程序,避免在事務方面養成一些不好的習慣。

1、認識事務

1.1、概述

事務可由一條非常簡單的SQL語句組成,也可以由一組複雜的SQL語句組成。事務是訪問並更新數據庫中各種數據項的一個程序執行單元。在事務中的操作,要麼都做修改,要麼都不做,這就是事務的目的,也是事務模型區別與文件系統的重要特徵之一。

A(Atomicity),原子性。即一組操作要麼都做,要麼都不做。
C(consistency),一致性。一致性指從事務將數據庫從一種狀態轉變爲下一種一致的狀態。
I(isolation),隔離性。隔離性還有其他的稱呼,如併發控制、可串行化、鎖等。事務的隔離性要求每個讀寫事務的對象對其他事務的操作對象能相互分離,即該事務提交前對其他事務都不可見,同常這使用鎖來實現。當前數據庫系統中都提供了一種粒度鎖的策略,允許事務僅鎖住一個實體對象的子集,以此來提高事務之間的併發度。
D(durability),持久性。事務一旦提交,其結果就是永久性的。

1.2、分類

從事務理論的角度來說,可以把事務分爲以下幾種類型:

  • 扁平事務
  • 帶有保存點的扁平事務
  • 鏈事務
  • 嵌套事務
  • 分佈式事務

扁平事務是事務類型中最簡單的一種,但在實際生產環境中,這可能是使用最爲頻繁的事務。在扁平事務中,所有操作都處於同一層次,其由BEGIN WORK開始,由COMMIT WORK和ROLLBACK WORK結束,其間的操作是原子的,要麼都執行,要麼都回滾。因此扁平事務是應用程序稱爲原子操作的基本組成模塊。

帶有保存點的扁平事務除了支持扁平事務支持的操作外,允許在事務執行過程中回滾到同一事務中較早的一個狀態。這是因爲某些事務可能在執行過程中出現的錯誤並不會導致所有的操作都無效,放棄整個事務不合乎要求,開銷也大。保存點用來通知系統應該記住事務當前的狀態,以便當之後發生錯誤時,事務能回到保存點當時的狀態。

對於扁平的事務來說,其隱式地設置了一個保存點。然而在整個事務中,只有這一個保存點,因此,回滾只能回滾到事務開始時的狀態。保存點用SAVE WORK函數來建立,通知系統記錄當前的狀態。當出現問題時,保存點能用作內部的重啓動點,根據應用邏輯,決定是回到最近一個保存點還是其他更早的保存點。

鏈事務可視爲保存點模式的一種變種。帶有保存點的扁平事務,當發生系統崩潰時,所有的保存點都將消失,因爲其保存點是易失的,而非持久的。這意味着當進行回覆時,事務需要從開始處重新執行,而不能從最近的一個保存點繼續執行。

鏈事務的思想是:在提交一個事務時,釋放不需要的數據對象,將必要的處理上下文隱式地傳給下一個要開始的事務。注意:提交事務操作和開始下一個事務操作將合併爲一個原子操作。這意味着下一個事務將看到上一個事務的結果,就好像在一個事務中進行的一樣。

鏈事務與帶有保存點的扁平事務不同的是,帶有保存點的扁平事務能回滾到任意正確的保存點。而鏈事務中的回滾僅限於當前事務,即只能恢復到最近一個的保存點。對於鎖的處理,兩者頁不相同。鏈事務在執行COMMIT後立即釋放了當前事務鎖持有的的鎖,而帶有保存點的扁平事務不影響迄今爲止所持有的鎖。

嵌套事務是一個層次結構框架。由一個頂層事務控制着各個層次的事務。頂層事務之下嵌套的事務被稱爲子事務,其控制着每一個局部的變換。

分佈式事務通常是在一個分佈式事務下運行的扁平事務,因此需要根據數據所在位置訪問網絡中的不同節點。

2、事務的實現

事務的隔離性由鎖來實現。原子性、一致性、持久性通過數據庫的redo log和undo log來完成。

3、事務控制語句

在MySQL默認設置下,事務都是自動提交的,即執行SQL語句後就會馬上執行COMMIT操作。因此要顯示地開啓一個事務需使用命令BEGIN、START TRANSACTION,或者執行命令SET AUTOCOMMIT=0,禁用當前會話的自動提交。

4、事務的隔離級別

SQL標準定義的四個隔離級別爲:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章