髒讀,不可重複讀,幻讀區別

2022-06-29 12:33:10 字數 915 閱讀 9015

在了解髒讀,不可重複度,幻讀之前,首先要明白這三種情況的出現都是和資料庫併發事務有關聯的,如果所有的讀寫都按照佇列的形式進行,就不會出現問題。

名詞解析和解決方案

髒讀

髒讀又稱無效資料讀出(讀出了髒資料)。乙個事務讀取另外乙個事務還沒有提交的資料叫髒讀。

例如:事務t1修改了某個表中的一行資料,但是還沒有提交,這時候事務t2讀取了被事務t1修改後的資料,之後事務t1因為某種原因回滾(rollback)了,那麼事務t2讀取的資料就是髒的(無效的)。

解決辦法:把資料庫的事務隔離級別調整到read_committed(讀提交/不可重複讀)

不可重複讀

不可重複讀是指在同乙個事務內,兩次相同的查詢返回了不同的結果。

例如:事務t1會讀取兩次資料,在第一次讀取某一條資料後,事務t2修改了該資料並提交了事務,t1此時再次讀取該資料,兩次讀取便得到了不同的結果。

解決辦法:把資料庫的事務隔離級別調整到repeatable_read(可重複讀)

幻讀

幻讀也是指當事務不獨立執行時,插入或者刪除另乙個事務當前影響的資料而發生的一種類似幻覺的現象。

例如:系統事務a將資料庫中所有資料都刪除的時候,但是事務b就在這個時候新插入了一條記錄,當事務a刪除結束後發現還有一條資料,就好像發生了幻覺一樣。這就叫幻讀。

解決辦法:把資料庫的事務隔離級別調整到serializable_read(序列化執行),或者資料庫使用者自己進行加鎖來保證。

題外話:

不可重複讀出現多是因為修改;幻讀重點是新增、刪除。mysql中的repeatable_read模式引入了間隙鎖(gap),解決了幻讀的問題。不論是什麼方式解決幻讀,都會付出一定代價的效能讓步。所以說在業務需求和技術方案之間權衡也是技術人員最需要掌握得技能之一。

髒讀,不可重複讀,幻讀

髒讀,不可重複讀,幻讀是由於資料庫事務的隔離性導致的問題。髒讀 乙個事務讀取到了其它未提交事務操作的記錄。不可重複讀 乙個事務a內,首次查詢到一條相同記錄,然後事務b修改該條記錄並提交,事務a再次執行相同查詢,得到了事務b更新後的結果,事務a兩次相同的查詢,卻得到了不同的結果,這個叫做不可重複讀。是...

髒讀 不可重複讀 幻讀

髒讀 事務a使用了資料,但是還沒來得及提交,事務b就使用了這個資料,對於事務b來說就是髒讀。允許髒讀 sql server select from category with nolock 不可重複讀 事務a在9點和12點都會操作乙份資料,但是在10點的時候,事務b也操作了該份資料,並且使其數值進行...

髒讀 不可重複讀 幻讀

總結 對於不可重複讀和幻讀的區別是 不可重複讀圈了一塊地,這塊地不允許任何人動用,但是不管旁邊的地方是否開闢了一塊地。幻讀是不僅是圈的地,而且附近也不允許有新的地。這個對於區間查詢會有影響。所以不可重複讀和幻讀最大的區別是區間查詢的結果會不會一樣。幻讀保證結果一樣,但是不可重複讀不保證。mysql的...