事務的四大特性(ACID)


Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的

1.原子性(A):是指事務要么都成功,要么都失敗。成功就影響數據庫,失敗就對數據庫不影響,保持原樣。

2.一致性(C):是指應用層系統從一種正確的狀態,在事務成功后,達成另一種正確的狀態。比如:A、B賬面共計100W,A向B轉賬,加上事務控制,轉成功后,他們賬戶總額應還是100W,事務應保持這種應用邏輯正確一致。還有,轉賬(事務成功)前后,數據庫內部的數據結構--比如賬戶表的主鍵、外鍵、列必須大於0、Btree、雙向鏈表等約束需要是正確的,和原來一致的。

3.隔離性(I):隔離是指當多個事務提交時,讓它們按順序串行提交,每個時刻只有一個事務提交。但隔離處理並發事務,效率很差。所以SQL標准制作者妥協了,提出了4種事務隔離等級(1,read-uncommited 未提交就讀,可能產生臟讀  2,read-commited 提交后讀  可能產生不可重復讀  3,repeatable-read 可重復讀  可能產生幻讀    4,serializable 序列化,最高級別,按順序串行提交) 事務的隔離性實現詳見https://zhuanlan.zhihu.com/p/27035174

4.持久性(D):是指事務一旦提交后,對數據庫中的數據改變是永久性的。

以上AID是數據庫的特性,C是應用層特性,AID是為C服務的,目的就是要保證邏輯能正確的執行。

 

一)臟讀:就是A事務在讀取數據時,B事務對同一個數據修改了,但B未提交,A再讀取時,讀到了B修改后的數據,但是B事務提交失敗,回滾,A后讀到的數據就是B修改后的臟數據,此為臟讀。

二)不可重復讀:就是A事務讀取數據,B事務改了這個數據,也提交成功了,A再讀取就是B修改后的數據,再也不能重復讀到最開始的那個數據值了,此為不可重復讀

三)幻讀:可重復讀就是A事務讀取數據,B事務改了這個數據(update),也提交成功了,A再讀這個數據,SQL機制強行讓A仍然讀之前讀到的數據值,這就是可重復讀,這種機制對Insert操作無效,A事務在可重復讀的機制下,讀取數據,B事務insert一條數據,提交成功,A再讀這個數據,會顯示B插入的數據,此為幻讀。

隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大。

大多數的數據庫默認隔離級別為 Read Commited,比如 SqlServer、Oracle

少數數據庫默認隔離級別為:Repeatable Read 比如: MySQL InnoDB

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM