数据库四种事务隔离级别详解
四種數據庫隔離級別及解決的數據問題如下所示:
1.READ-UNCOMMITTED(讀取未提交內容)
由于在該隔離級別下即使事務未提交所做的修改也會對其他事務產生影響。所以該級別會出現數據臟讀的發生。
臟讀:一個事務讀取了另一個未提交的并行事務寫的數據。
鎖情況:事務在讀取數據的時候并未對數據加鎖。在修改數據的時候只對數據增加行級共享鎖(其他事務可以讀取但是不可以更新)。因此,事務在讀取數據的時候會讀取到其他事務未提交的數據產生臟讀。
問題舉例:老板給員工發工資,老板開啟事務,然后想員工的賬戶轉錢10000元,事務暫不提交。此時員工開啟事務,查看賬戶余額發現多了10000元,然后提交事務。但是老板發現轉多了,于是修改為轉5000元,然后提交事務。最終員工賬戶多5000元而不是10000元,所以之前員工看到的10000元是臟數據。
2. READ-COMMITTED(讀取提交內容)
在該隔離級別下事務沒有提交是不會對其他事務產生影響的,只有提交的事務才會影響其他事務。所以避免了讀臟數據。但是該級別會出現兩次讀取數據庫數據不一致的情況(不可重復讀)。
不可重復讀:同一個事務中重新讀取前面讀取過的數據,發現兩次讀取數據不一樣(該數據已經被另一個已提交的事務修改過)。
鎖情況:事務對當前被讀取的數據加行級共享鎖,一旦讀完該行就立即釋放該鎖;事務在更新某數據的瞬間,必須先對數據增加行級排他鎖(其他事務不可以對該數據進行任何操作),直到事務結束才釋放。因此,事務在修改的工程中由于事務沒有提交所以不會影響到其他事務,避免了臟讀的發生。但是會出現不可重復讀的情況。
問題舉例:老板給員工發工資。員工開啟事務,查看賬戶余額(此時對數據增加了行級共享鎖),發現賬戶余額是0元,然后釋放了該鎖。發現老板尚未轉錢。此時,老板開啟事務,然后向員工的賬戶里面轉錢一萬元(事務對該數據增加了行級排他鎖),在事務未提交之前員工是無法進行查看余額的操作。緊接著老板提交事務,在這之后員工可以進行查看操作。然后員工覺得不對勁又查看了一次(員工之前的事務尚未提交),發現現在余額是一萬元。即員工在同一事務下兩次相同查看操作得到的結果不一致。
3. REPEATABLE-READ(可重復讀)
在該隔離級別下兩個事務同時進行,其中一個事務修改數據不會對另一個事務造成影響,即使修改的事務已經提交也不會對另一個事務造成影響。因此,該隔離級別不會出現不可重復讀的情況。但是,該級別下會出現幻讀。
幻讀:是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,以后就會發生操作第一個事務的用戶 發現表中還有沒有修改的數據行,就好象發生了幻覺一樣.
鎖情況:事務在讀取某數據的瞬間,必須先對其加行級共享鎖,直到事務結束才釋放;事務在更新某數據的瞬間,必須先對其加行級排他鎖,直到事務結束才釋放。因此,事務在讀取數據的時候其他事務是可以對該數據進行讀取操作,因此避免了不可重復讀的情況。但是無法避免幻讀的發生。
問題舉例:目前分數為90分以上的的學生有15人,事務A開啟,并讀取所有分數為90分以上的的學生人數(事務對該數據增加了行級共享鎖),發現有15人,暫不提交事務。此時,事務B開啟,并插入一條分數為99的學生記錄,然后提交事務。此時,事務A再次讀取90分以上的的學生,發現記錄為16人,多了一個人。此時產生了幻讀。
4.SERIERLIZED(可串行化)
該事務隔離級別最嚴厲,在進行查詢時就會對表加上共享鎖,其他事務對該表將只能進行讀操作,而不能進行寫操作。
鎖情況:事務在讀取數據時,必須先對其加表級共享鎖,直到事務結束才釋放;事務在更新數據時,必須先對其加表級排他鎖,直到事務結束才釋放。因此,事務A在查詢數據的時候就對該表增加了表級共享鎖,其他事務只可以對該表進行查詢操作直到事務A提交。所以避免了幻讀的產生。
現象:事務1正在讀取A表中的記錄時,則事務2也能讀取A表,但不能對A表做更新、新增、刪除,直到事務1結束。(因為事務一對表增加了表級共享鎖,其他事務只能增加共享鎖讀取數據,不能進行其他任何操作)
事務1正在更新A表中的記錄時,則事務2不能讀取A表的任意記錄,更不可能對A表做更新、新增、刪除,直到事務1結束。(事務一對表增加了表級排他鎖,其他事務不能對表增加共享鎖或排他鎖,也就無法進行任何操作)
轉載于:https://www.cnblogs.com/liuleicode/p/5796642.html
總結
以上是生活随笔為你收集整理的数据库四种事务隔离级别详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++面试基础
- 下一篇: Mysql主从复制,实现数据同步