日韩欧乱色一区二区三区在线_久久―日本道色综合久久_欧美日本一区二区_网曝91综合精品门事件在线

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 為什么MySQL在innodb引擎中即使使用了MVCC機制仍然會出現丟失更新?

為什么MySQL在innodb引擎中即使使用了MVCC機制仍然會出現丟失更新?

來源:千鋒教育
發布人:xqq
時間: 2023-10-13 07:59:40 1697155180

一、為什么MySQL在innodb引擎中即使使用了MVCC機制仍然會出現丟失更新

mvcc在innodb中只負責解決讀寫沖突,把普通select語句變成快照讀。寫沖突仍然是靠鎖來解決的。因此要解決你說的丟失更新,要用select…for update主動加x鎖。

當然mvcc不是說完全不能解決丟失更新,比如postgresql的serializable隔離級別下,遇到寫寫沖突直接向客戶端返回異常,保證只有一個事務可以更新成功。

Mysql在可重復讀隔離級別下可保證事務較高的隔離性,同樣的sql查詢語句在一個事務里多次執行查詢結果相同,就算其它事務對數據有修改也不會影響當前事務sql語句的查詢結果

?? 這個隔離性就是靠MVCC(Multi-Version Concurrency Control)機制保證

對一行數據的讀和寫兩個操作默認是不會通過加鎖互斥來保證隔離性,避免了頻繁加鎖互斥而在串行化隔離級別為了保證較高的隔離性是通過將所有操作加鎖互斥來實現的

延伸閱讀:

二、MVCC多版本并發控制機制的實現

undo日志版本鏈是指一行數據被多個事務依次修改過后,在每個事務修改完后,Mysql會保留修改前的數據undo回滾日志,并且用兩個隱藏字段trx_id和roll_pointer把這些undo日志串聯起來形成一個歷史記錄版本鏈。

在可重復讀隔離級別,當事務開啟,執行任何查詢sql時會生成當前事務的一致性視圖read-view該視圖在事務結束之前都不會變化(如果是讀已提交隔離級別在每次執行查詢sql時都會重新生成)該視圖由執行查詢時所有未提交事務id數組(數組里最小的id為min_id)和已創建的最大事務id(max_id)組成事務里任何sql的查詢結果需要從對應版本鏈里的最新數據開始逐條跟read-view做比對從而得到最終的快照結果

1.如果 row 的 trx_id 落在綠色部分( trx_id

2. 如果 row 的 trx_id 落在紅色部分( trx_id>max_id ),表示這個版本是由將來啟動的事務生成的,是不可見的(若 row 的 trx_id 就是當前自己的事務是可見的);

3. 如果 row 的 trx_id 落在黃色部分(min_id <=trx_id<= max_id),那就包括兩種情況:

若 row 的 trx_id 在視圖數組中,表示這個版本是由還沒提交的事務生成的,不可見(若 row 的 trx_id 就是當前自己的事務,是可見的);

若 row 的 trx_id 不在視圖數組中,表示這個版本是已經提交了的事務生成的,可見。

聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 南充市| 南江县| 固镇县| 台中县| 八宿县| 交口县| 探索| 华坪县| 梅州市| 盐源县| 新干县| 固镇县| 丹巴县| 云安县| 岐山县| 濮阳县| 惠水县| 祁门县| 永春县| 贵德县| 山西省| 晋宁县| 尼木县| 宁阳县| 曲沃县| 太谷县| 宁阳县| 铜山县| 武清区| 大港区| 镇赉县| 台江县| 镶黄旗| 濉溪县| 肇庆市| 察隅县| 海兴县| 噶尔县| 五莲县| 沾化县| 平定县|