最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MySQL事務(wù)的隔離級(jí)別與MVCC

 更新時(shí)間:2021年04月22日 10:21:58   作者:cool_wa  
這篇文章主要介紹了MySQL事務(wù)的隔離級(jí)別與MVCC的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下

事務(wù)隔離級(jí)別

事務(wù)并發(fā)執(zhí)行遇到的問(wèn)題

  • 臟寫
    • 如果一個(gè)事務(wù)修改了另一個(gè)未提交事務(wù)修改過(guò)的數(shù)據(jù),那就意味著發(fā)生了臟寫
  • 臟讀
    • 如果一個(gè)事務(wù)讀到了另一個(gè)未提交事務(wù)修改過(guò)的數(shù)據(jù),那就意味著發(fā)生了臟讀
  • 不可重復(fù)讀
    • 如果一個(gè)事務(wù)只能讀到另一個(gè)已經(jīng)提交的事務(wù)修改過(guò)的數(shù)據(jù),并且其他事務(wù)每對(duì)該數(shù)據(jù)進(jìn)行一次修改并提交后,該事務(wù)都能查詢到最新值,那就意味著發(fā)生了不可重復(fù)讀
  • 幻讀
    • 如果一個(gè)事務(wù)先根據(jù)某些條件查詢出一些記錄,之后另一個(gè)事務(wù)又向表中插入了符合這些條件的記錄,原先的事務(wù)再次按照該條件查詢時(shí),能把另一個(gè)事務(wù)插入的記錄也讀出來(lái),那就意味著發(fā)生了幻讀。
    • 幻讀強(qiáng)調(diào)的是一個(gè)事務(wù)按照某個(gè)相同條件多次讀取記錄時(shí),后讀取時(shí)讀到了之前沒(méi)有讀到的記錄
    • 那對(duì)于先前已經(jīng)讀到的記錄,之后又讀取不到這種情況,算啥呢?其實(shí)這相當(dāng)于對(duì)每一條記錄都發(fā)生了不可重復(fù)讀的現(xiàn)象。幻讀只是重點(diǎn)強(qiáng)調(diào)了讀取到了之前讀取沒(méi)有獲取到的記錄。

SQL標(biāo)準(zhǔn)中的四種隔離級(jí)別

  • READ UNCOMMITTED: 未提交讀 臟讀、不可重復(fù)讀、幻讀 發(fā)生
  • READ COMMITTED:已提交讀 不可重復(fù)讀、幻讀 發(fā)生
  • REPEATBLE READ:可重復(fù)讀 幻讀 發(fā)生
  • SERIALIZABLE:可串行化 不發(fā)生

MySQL中支持的四種隔離級(jí)別

  • MySQL在REPEATABLE READ隔離級(jí)別下,是可以禁止幻讀問(wèn)題的發(fā)生的(關(guān)于如何禁止我們之后會(huì)詳細(xì)說(shuō)明的)
  • MySQL默認(rèn)隔離級(jí)別為REPEATABLE READ

MVCC原理

版本鏈

對(duì)于使用InnoDB存儲(chǔ)引擎的表來(lái)說(shuō),它的聚簇索引記錄中都包含兩個(gè)必要的隱藏列

  • trx_id:每次一個(gè)事務(wù)對(duì)某條聚簇索引記錄進(jìn)行改動(dòng)時(shí),都會(huì)把該事務(wù)的事務(wù)id賦值給trx_id隱藏列
  • roll_pointer:每次對(duì)某條聚簇索引記錄進(jìn)行改動(dòng)時(shí),都會(huì)把舊的版本寫入到undo日志,然后這個(gè)隱藏列就相當(dāng)于一個(gè)指針,可以通過(guò)它來(lái)找到該記錄修改前的信息。

ReadView

  • 對(duì)于使用READ UNCIMMITTED隔離級(jí)別的事務(wù)來(lái)說(shuō),由于可以讀到未提交事務(wù)修改過(guò)的記錄,所以直接讀取記錄的最新版本就好了;
  • 對(duì)于使用READ COMMITTED 和REPEATABLE READ 隔離級(jí)別的事務(wù)來(lái)說(shuō),都必須保證讀到已經(jīng)提交了的事務(wù)修改過(guò)的記錄,也就是說(shuō)假如另一個(gè)事務(wù)已經(jīng)修改了記錄但是尚未提交,是不能直接讀取到最新版本記錄的。核心問(wèn)題:需要判斷一下版本鏈中的哪個(gè)版本是當(dāng)前事務(wù)可見(jiàn)的。為此設(shè)計(jì)了readview
  • readView包含4個(gè)比較重要的內(nèi)容:
    • m_ids:表示在生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍的讀寫事務(wù)的事務(wù)ID
    • min_trx_id:表示生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍的讀寫事務(wù)中最小的事務(wù)id,也就是m_ids中的最小值
    • max_trx_id: 表示生成ReadView時(shí)系統(tǒng)中應(yīng)該分配給下一個(gè)事務(wù)的id值
    • creator_trx_id:表示生成該ReadView的事務(wù)的事務(wù)ID
      • 我們前邊說(shuō)過(guò),只有在對(duì)表中的記錄做改動(dòng)時(shí)(執(zhí)行INSERT、DELETE、UPDATE這些語(yǔ)句時(shí))才會(huì)為事務(wù)分配事務(wù)id,否則在一個(gè)只讀事務(wù)中的事務(wù)id值都默認(rèn)為0。
  • 有了這個(gè)ReadView,這樣在訪問(wèn)某條記錄時(shí),只需要按照下邊的步驟判斷記錄的某個(gè)版本是否可見(jiàn):
    • 如果被訪問(wèn)的版本的trx_id屬性與ReadView中的creator_trx_id相同,意味著當(dāng)前事務(wù)在訪問(wèn)它自己修改過(guò)的記錄,所以該版本可以被當(dāng)前事務(wù)訪問(wèn)
    • 如果被訪問(wèn)的trx_id屬性值小于ReadView中的min_trx_id值,表明生成該版本的事務(wù)在當(dāng)前事務(wù)生成ReadView時(shí)已經(jīng)提交,所以該版本可以被當(dāng)前事務(wù)訪問(wèn)
    • 如果被訪問(wèn)版本的trx_id屬性值大于或等于ReadView中的max_trx_id值,表明生成該版本的事務(wù)在當(dāng)前事務(wù)生成ReadView后才開(kāi)啟,所以該版本不可以被當(dāng)前事務(wù)訪問(wèn)
    • 如果被訪問(wèn)版本的trx_id屬性值在ReadView的min_trx_id和max_trx_id之間,那就需要判斷一下trx_id屬性值是不是在m_ids列表中,如果在,說(shuō)明創(chuàng)建ReadView時(shí)生成該版本的事務(wù)還是活躍的,該版本不可被訪問(wèn);如果不在,說(shuō)明創(chuàng)建ReadView時(shí)生成該版本的事務(wù)已經(jīng)被提交,該版本可以被訪問(wèn)。

總結(jié)一下:

  • READ COMMITTED隔離級(jí)別的事務(wù)在每次查詢開(kāi)始時(shí)都會(huì)生成一個(gè)獨(dú)立的ReadView
  • REPEATABLE READ :在第一次讀取數(shù)據(jù)時(shí)生成一個(gè)ReadView,也就是說(shuō)兩次SELECT 查詢得到的結(jié)果是重復(fù)的。

MVCC總結(jié): 所謂的MVCC指的就是在使用 READ COMMITTED 和REPEATABLE READ 這兩種隔離級(jí)別的事務(wù)在執(zhí)行普通的SELECT 操作時(shí)訪問(wèn)的記錄的版本鏈的過(guò)程,這樣子可以使不用的事務(wù)的讀-寫、寫-讀操作并發(fā)執(zhí)行,從而提升性能。

mysql如何在RR級(jí)別解決幻讀的

1.當(dāng)前讀,讀的是最新版本,并且需要獲取對(duì)應(yīng)記錄的鎖,如下SQL

  • select ... lock in share mode
  • select ... for update
  • update 、delete 、insert

是通過(guò)next-key 來(lái)實(shí)現(xiàn)幻讀的

2.快照讀 是通過(guò)mvcc 來(lái)解決的

以上就是詳解MySQL事務(wù)的隔離級(jí)別與MVCC的詳細(xì)內(nèi)容,更多關(guān)于MySQL事務(wù)的隔離級(jí)別與MVCC的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SQL實(shí)現(xiàn)LeetCode(180.連續(xù)的數(shù)字)

    SQL實(shí)現(xiàn)LeetCode(180.連續(xù)的數(shù)字)

    這篇文章主要介紹了SQL實(shí)現(xiàn)LeetCode(180.連續(xù)的數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • MySQL刪除數(shù)據(jù)Delete與Truncate語(yǔ)句使用比較

    MySQL刪除數(shù)據(jù)Delete與Truncate語(yǔ)句使用比較

    在MySQL數(shù)據(jù)庫(kù)中,DELETE語(yǔ)句和TRUNCATE TABLE語(yǔ)句都可以用來(lái)刪除數(shù)據(jù),但是這兩種語(yǔ)句還是有著其區(qū)別的,下文就為您介紹這二者的差別所在
    2012-09-09
  • Mysql中如何刪除某個(gè)字段的最后四個(gè)字符

    Mysql中如何刪除某個(gè)字段的最后四個(gè)字符

    這篇文章主要介紹了Mysql中如何刪除某個(gè)字段的最后四個(gè)字符,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 詳解Mysql和Oracle之間的誤區(qū)

    詳解Mysql和Oracle之間的誤區(qū)

    mysql 和Oracle 在開(kāi)發(fā)中的使用是隨處可見(jiàn)的,那就簡(jiǎn)單去了解一下這倆款火的不行的數(shù)據(jù)庫(kù)。
    2021-05-05
  • MySQL 跨庫(kù)查詢示例場(chǎng)景分析

    MySQL 跨庫(kù)查詢示例場(chǎng)景分析

    在 MySQL 數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景中,有時(shí)需要從多個(gè)數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)并進(jìn)行關(guān)聯(lián)分析或綜合處理,這就涉及到跨庫(kù)查詢操作,本指南將詳細(xì)介紹 MySQL 跨庫(kù)查詢的方法、注意事項(xiàng)以及相關(guān)示例,感興趣的朋友一起看看吧
    2025-04-04
  • 一文徹底搞懂MySQL?TimeStamp時(shí)區(qū)問(wèn)題

    一文徹底搞懂MySQL?TimeStamp時(shí)區(qū)問(wèn)題

    MySQL的timestamp類型默認(rèn)使用的是服務(wù)器的時(shí)區(qū)來(lái)存儲(chǔ)時(shí)間值,這意味著如果服務(wù)器的時(shí)區(qū)發(fā)生了變化,那么存儲(chǔ)的timestamp值也會(huì)發(fā)生變化,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一文徹底搞懂MySQL?TimeStamp時(shí)區(qū)問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • MySQL千萬(wàn)表歸檔的項(xiàng)目實(shí)踐

    MySQL千萬(wàn)表歸檔的項(xiàng)目實(shí)踐

    本文主要介紹了MySQL千萬(wàn)表歸檔的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • MySQL中 and or 查詢的優(yōu)先級(jí)分析

    MySQL中 and or 查詢的優(yōu)先級(jí)分析

    這個(gè)可能是容易被忽略的問(wèn)題,首選我們要清楚,MySQL中,AND的執(zhí)行優(yōu)先級(jí)高于OR。也就是說(shuō),在沒(méi)有小括號(hào)()的限制下,總是優(yōu)先執(zhí)行AND語(yǔ)句,再執(zhí)行OR語(yǔ)句
    2021-03-03
  • 一次SQL如何查重及去重的實(shí)戰(zhàn)記錄

    一次SQL如何查重及去重的實(shí)戰(zhàn)記錄

    sql去重這可以說(shuō)算是比較經(jīng)典的面試題了,這篇文章主要給大家介紹了一次SQL如何查重及去重的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 在linux中導(dǎo)入sql文件的方法分享(使用命令行轉(zhuǎn)移mysql數(shù)據(jù)庫(kù))

    在linux中導(dǎo)入sql文件的方法分享(使用命令行轉(zhuǎn)移mysql數(shù)據(jù)庫(kù))

    為使用阿里云主機(jī),沒(méi)有裝ftp,也沒(méi)有裝phpmyadmin,所以一切都得靠命令行。轉(zhuǎn)移網(wǎng)站的重要一步就是轉(zhuǎn)移數(shù)據(jù)庫(kù),這里簡(jiǎn)單介紹一下如何在這種情況下導(dǎo)入sql文件
    2014-02-02

最新評(píng)論

乌鲁木齐县| 景洪市| 泰州市| 明光市| 阿图什市| 和田市| 柞水县| 怀来县| 汝州市| 清原| 平阴县| 尼勒克县| 贡嘎县| 泗阳县| 宁远县| 大冶市| 高雄市| 台北县| 龙胜| 石河子市| 逊克县| 酒泉市| 武安市| 永清县| 饶阳县| 定西市| 应城市| 青浦区| 廉江市| 北宁市| 七台河市| 莫力| 甘肃省| 左贡县| 肇庆市| 历史| 武隆县| 浑源县| 沾化县| 纳雍县| 九台市|