個人我的博客 http://www.haxianhe.com/數據庫
數據庫系統引入事務的主要目的:事務會把數據庫從一種狀態轉換爲另外一種一致狀態。在數據庫提交工做時,能夠確保要麼全部修改都已經保存了,要麼全部修改都不保存。
InnoDB存儲引擎中的事務徹底符合ACID特性。ACID是如下4個詞的縮寫:
原子性(atomicity)
一致性(consistency)
隔離性(isolation)
持久性(durability)
本篇文章主要關注事務的原子性這一律念,並說明怎樣正確使用事務及編寫正確的應用程序,避免在事務方面養成一些很差的習慣。網絡
一、認識事務
1.一、概述
事務可由一條很是簡單的SQL語句組成,也能夠由一組複雜的SQL語句組成。事務是訪問並更新數據庫中各類數據項的一個程序執行單元。在事務中的操做,要麼都作修改,要麼都不作,這就是事務的目的,也是事務模型區別與文件系統的重要特徵之一。併發
A(Atomicity),原子性。即一組操做要麼都作,要麼都不作。
C(consistency),一致性。一致性指從事務將數據庫從一種狀態轉變爲下一種一致的狀態。
I(isolation),隔離性。隔離性還有其餘的稱呼,如併發控制、可串行化、鎖等。事務的隔離性要求每一個讀寫事務的對象對其餘事務的操做對象能相互分離,即該事務提交前對其餘事務都不可見,同常這使用鎖來實現。當前數據庫系統中都提供了一種粒度鎖的策略,容許事務僅鎖住一個實體對象的子集,以此來提升事務之間的併發度。
D(durability),持久性。事務一旦提交,其結果就是永久性的。框架
1.二、分類
從事務理論的角度來講,能夠把事務分爲如下幾種類型:分佈式
- 扁平事務
- 帶有保存點的扁平事務
- 鏈事務
- 嵌套事務
- 分佈式事務
扁平事務是事務類型中最簡單的一種,但在實際生產環境中,這多是使用最爲頻繁的事務。在扁平事務中,全部操做都處於同一層次,其由BEGIN WORK開始,由COMMIT WORK和ROLLBACK WORK結束,其間的操做是原子的,要麼都執行,要麼都回滾。所以扁平事務是應用程序稱爲原子操做的基本組成模塊。函數
帶有保存點的扁平事務除了支持扁平事務支持的操做外,容許在事務執行過程當中回滾到同一事務中較早的一個狀態。這是由於某些事務可能在執行過程當中出現的錯誤並不會致使全部的操做都無效,放棄整個事務不合乎要求,開銷也大。保存點用來通知系統應該記住事務當前的狀態,以便當以後發生錯誤時,事務能回到保存點當時的狀態。atom
對於扁平的事務來講,其隱式地設置了一個保存點。然而在整個事務中,只有這一個保存點,所以,回滾只能回滾到事務開始時的狀態。保存點用SAVE WORK函數來創建,通知系統記錄當前的狀態。當出現問題時,保存點能用做內部的重啓動點,根據應用邏輯,決定是回到最近一個保存點仍是其餘更早的保存點。spa
鏈事務可視爲保存點模式的一種變種。帶有保存點的扁平事務,當發生系統崩潰時,全部的保存點都將消失,由於其保存點是易失的,而非持久的。這意味着當進行回覆時,事務須要從開始處從新執行,而不能從最近的一個保存點繼續執行。對象
鏈事務的思想是:在提交一個事務時,釋放不須要的數據對象,將必要的處理上下文隱式地傳給下一個要開始的事務。注意:提交事務操做和開始下一個事務操做將合併爲一個原子操做。這意味着下一個事務將看到上一個事務的結果,就好像在一個事務中進行的同樣。事務
鏈事務與帶有保存點的扁平事務不一樣的是,帶有保存點的扁平事務能回滾到任意正確的保存點。而鏈事務中的回滾僅限於當前事務,即只能恢復到最近一個的保存點。對於鎖的處理,二者頁不相同。鏈事務在執行COMMIT後當即釋放了當前事務鎖持有的的鎖,而帶有保存點的扁平事務不影響迄今爲止所持有的鎖。
嵌套事務是一個層次結構框架。由一個頂層事務控制着各個層次的事務。頂層事務之下嵌套的事務被稱爲子事務,其控制着每個局部的變換。
分佈式事務一般是在一個分佈式事務下運行的扁平事務,所以須要根據數據所在位置訪問網絡中的不一樣節點。
二、事務的實現
事務的隔離性由鎖來實現。原子性、一致性、持久性經過數據庫的redo log和undo log來完成。
三、事務控制語句
在MySQL默認設置下,事務都是自動提交的,即執行SQL語句後就會立刻執行COMMIT操做。所以要顯示地開啓一個事務需使用命令BEGIN、START TRANSACTION,或者執行命令SET AUTOCOMMIT=0,禁用當前會話的自動提交。
四、事務的隔離級別
SQL標準定義的四個隔離級別爲:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE