Mysql資料庫隔離級別鎖關係髒讀不可重複讀幻讀

2021-10-09 19:26:49 字數 1056 閱讀 8984

我們在進行資料庫開發時經常會遇到程式事務的相關問題,對於髒讀、幻讀、不可重複讀等問題的處理。

資料庫隔離級別以及會出現的問題,如下**:

隔離級別

資料丟失

髒讀不可重複讀

幻讀讀未提交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釋放它的鎖之前,其它的事務...