數據庫四大特性及數據庫隔離級別


數據庫的四大特性ACID:

1. 原子性(Atomicity)

原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾。

2. 一致性(Consistency)

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

3. 隔離性(Isolation)

隔離性是指當用戶並發訪問數據庫時,多個並發事務之間,應當相互隔離。(最差的是,串行執行即一個事務執行完成之后,另一個事務在執行)

4. 持久性(Durability)

持久性是指事務的操作,一旦提交,對於數據庫中數據的改變是永久性的

由不同隔離性引發的數據不一致性:

1. 臟讀

臟讀是指一個事務讀取了未提交事務執行過程中(包換了多次的dml,但是未提交事務,隨時可能回滾)的數據。

eg:當一個事務的操作正在多次修改數據,而在事務還未提交的時候,另外一個並發事務來讀取了數據,就會導致讀取到的數據並非是最終持久化之后的數據,這個數據就是臟讀的數據。

2.不可重復讀

不可重復讀是一個事務執行過程中,另一事務提交並修改了當前事務正在讀取的數據,導致當前事務讀取到了不同的數據。(樂觀鎖實現原理,靠不可重復讀觸發數據不一致,來數據回滾)

3.幻讀:

幻讀和不可重復讀都是讀取了已經提交的事務(這點同臟讀不同),不可重復讀查詢的都是同一個數據項而幻讀針對的是一批數據整體(比如數據的個數)。

MySQL定義了四種隔離級別:(依次是:讀未提交,讀已提交,可重復讀,串行讀取)

補充:

repeatable read是mysql默認事務隔離級別

read commited是大多數數據庫的默認隔離級別

serializable級別是最高級別的隔離級。它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡而言之,SERIALIZABLE是在每個讀的數據行上加鎖。在這個級別,可能導致大量的超時和鎖競爭現象,實際應用中很少使用到這個級別,但如果用戶的應用為了數據的穩定性,需要強制減少並發的話,也可以選擇這種隔離級

 

鎖機制

共享鎖(讀鎖:大家能讀)

讀表時加鎖,加鎖后其他用戶只能獲取該表或行的共享鎖,不能獲取排它鎖,也就是說只能讀不能寫

排它鎖(寫鎖:個人能寫)

寫表時加鎖,加鎖后其他用戶不能獲取該表或行的排他鎖,共享鎖

表鎖

給整張表加鎖

行鎖

給行數據加鎖

因此鎖可以分為表級共享鎖行級共享鎖表級排它鎖行級排它鎖


轉載:https://www.jianshu.com/p/b0d0c0b04fb7


免責聲明!

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



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