Mysql之事務

什麼是事務

假如你下了一筆訂單,會有如下數據庫操做:數據庫

1. 生成一筆訂單記錄 
2. 減小庫存  
3. 從你的帳戶中減小金額  
4. 生成支付記錄

這邊的四個操做缺一不可,一旦某一個操做出現異常,則所有操做都須要所有回滾。而事務的做用就是保證在出現異常的狀況下可以對操做進行回滾。併發

事務的特性:

原子性(Atomicity)

  原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾。所以事務的操做若是成功就必需要徹底應用到數據庫,若是操做失敗則不能對數據庫有任何影響。分佈式

一致性(Consistency)

  一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態。
  拿轉帳來講,假設用戶A和用戶B二者的錢加起來一共是5000,那麼無論A和B之間如何轉帳,轉幾回帳,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。code

隔離性(Isolation)

  隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。
  即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始以前就已經結束,要麼在T1結束以後纔開始,這樣每一個事務都感受不到有其餘事務在併發地執行。事務

持久性(Durability)

  持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。ci

事務的隔離級別

髒讀

  髒讀是指在一個事務讀取了另外一個未提交的事務中的數據。
  如:事務B商品C的庫存進行了修改,可是該事務還未提交。這時候事務A讀取了商品C的庫存,後來發現代碼有問題,對事務B進行了回滾,那麼事務A讀取的就是髒數據了。
  通常都是事務的隔離級別保證的就是這個,隔離級別越高效率越低。it

不可重複讀

  不可重複讀是指事務A在查詢過程當中,事務B修改了數據。第一次和第二次的結果不一樣。
  但這是能夠接受的。io

幻讀

   幻讀指的是事務A在讀取過程,事務B對添加了一些數據,致使讀取的結果長度有了變化。效率

場景

具體場景

  1. 如上述所說,一個操做須要有多個操做來完成時須要事務

代碼場景

  1. 一個方法內部,對數據庫的寫操做超過兩條及以上。

分佈式事務

   假設上述的操做,在四個節點進行操做,普通的事務回滾將不會有效。由於不知道全部的操做是否都成功了。方法

解決辦法一: 事務補償

相關文章
相關標籤/搜索