我們在進行資料庫開發時經常會遇到程式事務的相關問題,對於髒讀、幻讀、不可重複讀等問題的處理。
資料庫隔離級別以及會出現的問題,如下**:
隔離級別
資料丟失
髒讀不可重複讀
幻讀讀未提交read uncommitted
noyes
yesyes
讀已提交 read committed
nono
yesyes
可重複讀 repeatable read
nono
noyes
序列化 serializable
nono
nono
mysql預設是可重複讀
oracle只支援兩種級別,讀已提交與序列化,預設為讀已提交
事務a事務b獲取資料d的x鎖
讀取d的值1
d=d+1
d=2寫資料庫
事務出錯回滾操作
d=1釋放d的x鎖
讀取d的值
d=2這個時候b就發生了髒讀,b得到的是2
其實資料中d依然等於1
事務a事務b
獲取d的s鎖
讀取d的值1
d=1釋放d的s鎖
再次獲取d的s鎖
讀取d的值2
釋放d的s鎖
此時d=2
由此就出現了不可重複讀
兩次讀取的資料不一樣
獲取d的x鎖
讀取d的值2
對其進行修改
d=d+1
釋放d的x鎖
d=2事務a
事務b獲取d的x鎖
讀取到所有姓王的記錄
修改所有姓王的人的成績為60分
提交事務
釋放d的x鎖
此時d資料的年齡全部加了1
獲取d的s鎖
讀取d的資料
釋放d的s鎖
此時發現怎麼還有一條姓王的人
的成績不是60分
難道我出現幻覺了?
新增一條d資料也姓王成績為50分
提交事務
資料庫鎖 隔離級別
併發控制主要是為了多執行緒操作時帶來的資源讀寫問題。如果不加以空間可能會出現死鎖,讀髒資料 不可重複讀 丟失更新等異常。併發操作可以通過加鎖的方式進行控制,鎖又可分為樂觀鎖和悲觀鎖。悲觀鎖 pessimistic locking 併發模式假定系統中存在足夠多的資料修改操作,以致於任何確定的讀操作都可...
資料庫鎖和資料庫隔離級別
最近突然發現忘了資料庫鎖和資料庫隔離級別,時常弄混它們之間的關係。為此特此寫下此部落格,以方便自己複習,同時也可以幫助博友。資料庫鎖 資料庫鎖就是事務t在對某個資料物件 例如表 記錄等 操作之前,先向系統發出請求,對其加鎖。加鎖後事務t就對該資料物件有了一定的控制,在事務t釋放它的鎖之前,其它的事務...
資料庫鎖和資料庫隔離級別
最近突然發現忘了資料庫鎖和資料庫隔離級別,時常弄混它們之間的關係。為此特此寫下此部落格,以方便自己複習,同時也可以幫助博友。資料庫鎖 資料庫鎖就是事務t在對某個資料物件 例如表 記錄等 操作之前,先向系統發出請求,對其加鎖。加鎖後事務t就對該資料物件有了一定的控制,在事務t釋放它的鎖之前,其它的事務...