為什么MySQL在innodb引擎中即使使用了MVCC機制仍然會出現(xiàn)丟失更新?
一、為什么MySQL在innodb引擎中即使使用了MVCC機制仍然會出現(xiàn)丟失更新
mvcc在innodb中只負(fù)責(zé)解決讀寫沖突,把普通select語句變成快照讀。寫沖突仍然是靠鎖來解決的。因此要解決你說的丟失更新,要用select…for update主動加x鎖。
當(dāng)然mvcc不是說完全不能解決丟失更新,比如postgresql的serializable隔離級別下,遇到寫寫沖突直接向客戶端返回異常,保證只有一個事務(wù)可以更新成功。
Mysql在可重復(fù)讀隔離級別下可保證事務(wù)較高的隔離性,同樣的sql查詢語句在一個事務(wù)里多次執(zhí)行查詢結(jié)果相同,就算其它事務(wù)對數(shù)據(jù)有修改也不會影響當(dāng)前事務(wù)sql語句的查詢結(jié)果
?? 這個隔離性就是靠MVCC(Multi-Version Concurrency Control)機制保證
對一行數(shù)據(jù)的讀和寫兩個操作默認(rèn)是不會通過加鎖互斥來保證隔離性,避免了頻繁加鎖互斥而在串行化隔離級別為了保證較高的隔離性是通過將所有操作加鎖互斥來實現(xiàn)的延伸閱讀:
二、MVCC多版本并發(fā)控制機制的實現(xiàn)
undo日志版本鏈?zhǔn)侵敢恍袛?shù)據(jù)被多個事務(wù)依次修改過后,在每個事務(wù)修改完后,Mysql會保留修改前的數(shù)據(jù)undo回滾日志,并且用兩個隱藏字段trx_id和roll_pointer把這些undo日志串聯(lián)起來形成一個歷史記錄版本鏈。
在可重復(fù)讀隔離級別,當(dāng)事務(wù)開啟,執(zhí)行任何查詢sql時會生成當(dāng)前事務(wù)的一致性視圖read-view該視圖在事務(wù)結(jié)束之前都不會變化(如果是讀已提交隔離級別在每次執(zhí)行查詢sql時都會重新生成)該視圖由執(zhí)行查詢時所有未提交事務(wù)id數(shù)組(數(shù)組里最小的id為min_id)和已創(chuàng)建的最大事務(wù)id(max_id)組成事務(wù)里任何sql的查詢結(jié)果需要從對應(yīng)版本鏈里的最新數(shù)據(jù)開始逐條跟read-view做比對從而得到最終的快照結(jié)果1.如果 row 的 trx_id 落在綠色部分( trx_id 2. 如果 row 的 trx_id 落在紅色部分( trx_id>max_id ),表示這個版本是由將來啟動的事務(wù)生成的,是不可見的(若 row 的 trx_id 就是當(dāng)前自己的事務(wù)是可見的); 3. 如果 row 的 trx_id 落在黃色部分(min_id <=trx_id<= max_id),那就包括兩種情況: 若 row 的 trx_id 在視圖數(shù)組中,表示這個版本是由還沒提交的事務(wù)生成的,不可見(若 row 的 trx_id 就是當(dāng)前自己的事務(wù),是可見的); 若 row 的 trx_id 不在視圖數(shù)組中,表示這個版本是已經(jīng)提交了的事務(wù)生成的,可見。

猜你喜歡LIKE
相關(guān)推薦HOT
更多>>
redis怎么實現(xiàn)數(shù)據(jù)庫類似rank并列排名?
一、redis實現(xiàn)數(shù)據(jù)庫類似rank并列排名的方法Sorted Set是一個有序的集合,其中的每個成員都會被賦予一個分?jǐn)?shù)(score),通過對分?jǐn)?shù)的操作可以實...詳情>>
2023-10-15 17:23:44
Oracle怎么修改某個字段特定位置的字符?
一、Oracle修改某個字段特定位置的字符的方法1、查找需要修改的記錄“查找需要修改的記錄是指在數(shù)據(jù)庫中定位需要進(jìn)行修改的數(shù)據(jù)行。在進(jìn)行數(shù)據(jù)...詳情>>
2023-10-15 16:30:30
騰訊星圖(Star Knowledge Graph)是什么樣的數(shù)據(jù)庫?
一、騰訊星圖(Star Knowledge Graph)是什么樣的數(shù)據(jù)庫騰訊星圖(Star Knowledge Graph,即SKG,也稱知識圖譜),是一個圖數(shù)據(jù)庫和圖計算引擎...詳情>>
2023-10-15 16:06:16
Python線程為什么搞個setDaemon?
一、Python線程為什么搞個setDaemon當(dāng)啟動一個線程時設(shè)置thread.setDaemon(True),則該線程為守護線程(也可以稱為后臺線程)。表示該線程是不...詳情>>
2023-10-15 10:34:46熱門推薦
什么是云訪問安全代理(CASB)?
沸MYSQL 查詢庫存結(jié)存數(shù)量語句怎么寫?
熱VUE使用什么連接并搭建搭建本地數(shù)據(jù)庫?
熱超級APP系統(tǒng)比市場APP系統(tǒng)有哪些亮點呢?
新哪些平臺支持Python編程?
mysql有排他鎖為什么還需要共享鎖呢?
為什么搜索引擎在磁盤上的索引不能做到實時添加而數(shù)據(jù)庫可以?
設(shè)置數(shù)據(jù)庫的字符集和設(shè)置表字段字符集的區(qū)別是什么?
windows版oracle為什么老是卸載不干凈?
redis怎么實現(xiàn)數(shù)據(jù)庫類似rank并列排名?
sql server2000導(dǎo)出CSV文件用EXCEL數(shù)據(jù)格式出錯怎么處理?
Oracle怎么修改某個字段特定位置的字符?
Django項目中如何配置MySQL數(shù)據(jù)庫?
騰訊星圖(Star Knowledge Graph)是什么樣的數(shù)據(jù)庫?
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費用
了解課程價格 -
優(yōu)惠活動
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團隊
了解師資團隊 -
實戰(zhàn)項目
獲取項目源碼 -
開班地區(qū)
查看來校路線