什麼是事務
假如你下了一筆訂單,會有以下數據庫操作:
1. 生成一筆訂單記錄
2. 減少庫存
3. 從你的賬戶中減少金額
4. 生成支付記錄
這邊的四個操作缺一不可,一旦某一個操作出現異常,則全部操作都需要全部回滾。而事務的作用就是保證在出現異常的情況下能夠對操作進行回滾。
事務的特性:
原子性(Atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾。因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。
一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。
隔離性(Isolation)
隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。
即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後纔開始,這樣每個事務都感覺不到有其他事務在併發地執行。
持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
事務的隔離級別
髒讀
髒讀是指在一個事務讀取了另一個未提交的事務中的數據。
如:事務B
對商品C
的庫存進行了修改,但是該事務還未提交。這時候事務A
讀取了商品C
的庫存,後來發現代碼有問題,對事務B
進行了回滾,那麼事務A
讀取的就是髒數據了。
一般都是事務的隔離級別保證的就是這個,隔離級別越高效率越低。
不可重複讀
不可重複讀是指事務A
在查詢過程中,事務B
修改了數據。第一次和第二次的結果不同。
但這是可以接受的。
幻讀
幻讀指的是事務A
在讀取過程,事務B
對添加了一些數據,導致讀取的結果長度有了變化。
場景
具體場景
- 如上述所說,一個操作需要有多個操作來完成時需要事務
代碼場景
- 一個方法內部,對數據庫的寫操作超過兩條及以上。
分佈式事務
假設上述的操作,在四個節點進行操作,普通的事務回滾將不會有效。因爲不知道所有的操作是否都成功了。