在我們瞭解數據庫隔離級別前先來回顧一下數據庫讀數據時可能遇到的問題:
(1)髒讀
一個事務對數據進行更新操作,但還完成,此時另一事務讀取該數據,如果此時第一個事務由於操作失敗進行了回滾,那麼此時另外事務讀取的數據就是髒數據。
(2)不可重複讀
例如事務A在讀取某一數據,而事務B立馬修改了這個數據並且提交事務給數據庫,事務A再次讀取該數據就得到了不同的結果,發送了不可重複讀。
ps:在某些情況下,不可重複讀並不是問題,比如我們多次查詢某個數據當然以最後查詢得到的結果爲主。但在另一些情況下就有可能發生問題,例如對於同一個數據A和B依次查詢就可能不同,A和B就可能打起來了……
(3)幻讀
事例:事務A將表中所有數據都清爲0,就在這時事務B插入了一條2的數據,此時A再查看發現出現了一條爲2的數據,就像發生了幻覺一樣。
四種隔離級別
(1)Read uncommitted
讀未提交,讀的事務還沒有提交就會被讀,會出現髒讀的現象。 ----寫允許讀
(2)Read committed
讀提交,就是隻讀提交後的事務,若有事務對數據進行更新(UPDATE)操作時,讀操作事務要等待這個更新操作事務提交後才能讀取數據,可以解決髒讀問題。出現了一個事務範圍內兩個相同的查詢卻返回了不同數據,這就是不可重複讀。 ----寫禁止讀
(3)Repeatable read
可重複讀,就是在開始讀取數據(事務開啓)時,不再允許修改操作。 ----讀禁止寫,寫禁止所有事務。
(4)Serializable
Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。
說到事務的特性之前我們先來談談什麼是事務
定義:數據庫事務是構成單一邏輯工作單元的操作集合
舉個例子:
BEGIN TRANSACTION //事務開始 SQL1 SQL2 SQL3 ... COMMIT/ROLLBACK //事務提交或回滾
事務的四大特性:
原子性(atomicity):原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾
一致性(consistency):一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
隔離性(isolation):隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離
持久性(durability):一旦事務提交,則其所做的修改就會永久保存到數據庫中。此時即使系統崩潰,修改的數據也不會丟失。