真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql幻影讀怎么解決 mysql是如何解決幻讀

正確理解MYSQL的幻讀

一、定義

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、集安網(wǎng)站維護、網(wǎng)站推廣。

1、幻讀MYSQL官方叫法是Phantom Rows,意為鬼影行或者幻影行,請看官方定義:

The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a [ SELECT ] is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.

翻譯一下:

所謂的幻影行問題是指,在同一個事務(wù)中,同樣的查詢語句執(zhí)行多次,得到了不同的行結(jié)果集。

例如,如果同一個SELECT語句執(zhí)行了兩次,第二次執(zhí)行的時候比第一次執(zhí)行時多出一行,則該行就是所謂的幻影行。

2、幻讀與不可重復讀的區(qū)別

從官方的定義來看,幻讀的定義側(cè)重于多條記錄,就是記錄條數(shù)的變化,而不可重復讀側(cè)重于單條記錄數(shù)據(jù)的變化,這樣區(qū)分原因在于解決幻讀需要范圍鎖,解決不可重復讀只需要單條記錄加鎖

二、InnoDB的REPEATABLE READ級別

InnoDB支持由SQL1992標準描述的所有四個事務(wù)隔離級別,默認隔離級別是 REPEATABLE READ。

1、快照讀:

在RR模式下,第一次讀取會建立快照,后續(xù)查詢會讀取快照。

這意味著,如果在同一事務(wù)中發(fā)出多個普通[ SELECT ](非鎖定)語句,則這些 [ SELECT ]語句的結(jié)果也是一致的。

2、[locking reads](鎖定讀取,又叫當前讀)

[ SELECT ]語句中使用 FOR UPDATE 或 FOR SHARE

3、行鎖

在RR模式下,使用當前讀以及 [ UPDATE ]和 [ DELETE ]語句會對數(shù)據(jù)記錄加行鎖,鎖定范圍取決于該語句使用的是具有唯一搜索條件的唯一索引還是范圍類型搜索條件。

三、InnoDB的READ COMMITTED級別

1、在RC模式下,每次讀取都會刷新快照,因此不能保證可重復讀

2、在RC模式下,使用當前讀以及 [ UPDATE ]和 [ DELETE ]語句會對數(shù)據(jù)記錄加行鎖,但是不會加范圍鎖,間隙鎖定僅用于外鍵約束檢查和重復鍵檢查。

3、由于禁用了間隙鎖定,因此可能會產(chǎn)生幻影行問題,因為其他會話可以在間隙中插入新行。

4、 對于[ UPDATE ]或 [ DELETE ]語句, InnoDB 僅對其更新或刪除的行持有鎖。MySQL評估 WHERE 條件后,將釋放不匹配行的記錄鎖 。這大大降低了死鎖的可能性,但是仍然可以發(fā)生。

5、對于[ UPDATE ]語句,如果某行已被鎖定,則 InnoDB 執(zhí)行“半一致”讀取,將最新提交版本的數(shù)據(jù)返回給MySQL,以便MySQL可以確定該行是否符合 WHERE 條件。如果該行匹配(必須更新),則MySQL會再次讀取該行,這一次 InnoDB 會將其鎖定或等待獲取鎖。

6、注意

從MySQL 8.0.22開始,DML操作(增刪改,通過聯(lián)接列表或子查詢)從MySQL授權(quán)表中讀取數(shù)據(jù),但不對其進行修改,無論隔離級別如何,都不會在MySQL授權(quán)表上獲得讀取鎖。

有關(guān)更多信息,請參見 Grant Table Concurrency 。

四、樂觀鎖與悲觀鎖

1、樂觀鎖

在UPDATE的WHERE子句中加入版本信息來確定修改是否生效

使用樂觀鎖時仍然需要非常謹慎,因為RR是可重復讀的,在UPDATE之前讀取版本號,應該使用[當前讀],不能使用[快照讀]

2、悲觀鎖

在UPDATE執(zhí)行前,SELECT后面加上FOR UPDATE來給記錄加鎖,保證記錄在UPDATE前不被修改。SELECT ... FOR UPDATE是加上了X鎖,也可以通過SELECT ... LOCK IN SHARE MODE加上S鎖,來防止其他事務(wù)對該行的修改。

3、無論是樂觀鎖還是悲觀鎖,使用的思想都是一致的,那就是當前讀。樂觀鎖利用當前讀判斷是否是最新版本,悲觀鎖利用當前讀鎖定行。

五、總結(jié)

1、RC級別沒有范圍鎖一定會導致不可重復讀和幻影行

2、RR級別安全性更高,實現(xiàn)可重復讀的方式為快照,如果需要最新數(shù)據(jù)可以選擇[當前讀],因此RR級別是首選

3、不論RR還是RC級別,增、刪、改的操作都會進行一次[當前讀]操作,以此獲取最新版本的數(shù)據(jù),并檢測是否有重復的索引。

4、RR級別下,當前事務(wù)如果未發(fā)生更新操作(增刪改),快照版本會保持不變,多次查詢讀取的快照是同一個

5、RR級別下,當前事務(wù)如果發(fā)生更新(增刪改),會刷新快照,會導致不可重復讀和幻影行

6、RR級別下,使用當前讀,會刷新快照,會導致不可重復讀和幻影行

7、RR級別下,可以通過提交當前事務(wù)并在此之后發(fā)出新查詢來為查詢獲取更新的快照。

8、RR級別可以部分解決不可重復讀和幻讀問題

9、其實問題的關(guān)鍵是你的業(yè)務(wù)邏輯需要可重復讀還是最新數(shù)據(jù)

mysql如何解決幻讀

幻讀是指:在一個事務(wù)中,讀取到了其他已經(jīng)提交的事務(wù)插入的數(shù)據(jù)行。

MySQL在解決臟讀、不可重復的讀時候,使用了MVCC一致性視圖,同時配合行鎖來解決。

至于幻讀的解決方式,MySQL引入了臨鍵鎖,通過間隙鎖可以避免在兩個行之間插入數(shù)據(jù),從而避免了一個事務(wù)在讀取的過程中,讀取到其他事務(wù)插入的數(shù)據(jù)行。

mysql查詢的時候怎么解決臟讀,幻讀問題

3). 幻讀 :

是指當事務(wù)不是獨立執(zhí)行時發(fā)生的一種現(xiàn)象,例如第一個事務(wù)對一個表中的數(shù)據(jù)進行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時,第二個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復本時,發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。

關(guān)于MySQL的幻讀問題,看這一篇就夠了

什么是幻讀?

幻讀指的是一個事務(wù)在前后兩次查詢同一個范圍的時候,后一次查詢看到了前一次查詢沒有看到的行。

首先快照讀是不存在幻讀的,只有當前讀(實時讀)才存在幻讀的問題。

幻讀有什么問題?

select ...for update語句就是將相應的數(shù)據(jù)行鎖住,但是如果存在幻讀,就把for update的語義破壞了。

如何解決幻讀?

產(chǎn)生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個動作,要更新的是記錄之間的“間隙”。因此,為了解決幻讀問題,InnoDB只好引入新的鎖,也就是間隙鎖(Gap Lock)。間隙鎖和行鎖合稱 next-key lock , 每個next-key lock是前開后閉區(qū)間 。

總結(jié)


文章名稱:mysql幻影讀怎么解決 mysql是如何解決幻讀
當前路徑:http://weahome.cn/article/hhhphc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部