數據庫事務的四個特性ACID


原子性【Atomicity】

原子性指的指的就是這個操作,要么全部成功,要么全部失敗回滾。不存在其他的情況。

一致性(Consistency)

一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處於一致性狀態。

舉個例子。就是A和B的錢是1000元,A給你100元,無論最后雙方轉了多少次,總的錢一定是1000元。

隔離性(Isolation)

隔離性是當多個用戶並發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個並發事務之間要相互隔離

持久性(Durability)

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

並發操作幾個問題

在事務的並發操作中可能會出現臟讀,不可重復讀,幻讀。

臟讀

臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。

比如A轉賬給B100元,然后還沒有提交成功,這個時候,你用B用手機付款,這個事務讀取到這個100了。然后就行了扣款,B讀到的這個數據就是臟數據。因為A沒有提交,可能會撤銷。

不可重復讀

不可重復讀是指在對於數據庫中的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值,這是由於在查詢間隔,被另一個事務修改並提交了。不可重復讀一般是update操作

舉例:比如A事務 讀取了一個記錄,然后此時B事務修改了這個記錄會提交了,A事務再進行讀取的時候就會跟之前的記錄不一樣。 會產生我們說的ABA問題。

幻讀

幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個數據項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是為“1”並且提交給數據庫。而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。 幻讀一般是insert操作

舉例:程序員某一天去消費,花了2千元,然后他的妻子去查看他今天的消費記錄(全表掃描FTS,妻子事務開啟),看到確實是花了2千元,就在這個時候,程序員花了1萬買了一部電腦,即新增INSERT了一條消費記錄,並提交。當妻子打印程序員的消費記錄清單時(妻子事務提交),發現花了1.2萬元,似乎出現了幻覺,這就是幻讀。

四種隔離

數據庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。

Read uncommitted 未提交讀

最低的隔離,就是可以讀取到未提交的數據。會產生臟讀。

A給B轉賬1000元。開啟事務,還沒提交。 此時B查看自己余額多了1000元。但是突然A輸錯了密碼。放棄了轉款,回滾。此時這個B看到1000元就是一個臟數據,因為事務沒有提交完成。

Read committed 提交讀

就是一個事務要等另一個事務提交后才能讀取數據。

比如A的卡里有1000元。去請吃飯花付錢需要花900元。然后此時他媳婦B取出了500.當結賬的時候,就會出現付款失敗。出現這種情況,就是因為出現了B取錢的時候,沒有等待A刷卡這個事務完成,而自己的事務開始讀取和提交了數據。

Repeatable read 重復讀 

重復讀,就是在開始讀取數據(事務開啟)時,不再允許修改操作。MySQL默認的事務隔離級別是Rr 重復讀

比如上面的例子。當A進行付款的時候,B取款的操作就應該等待,不允許進行修改。

Serializable 序列化

Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。

序列化就是將並行的操作。改成順序執行。


免責聲明!

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



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