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

詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC

 更新時間:2021年03月24日 09:40:47   作者:https://segmentfault.com/a/1190000037461814  
這篇文章主要介紹了詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC的相關(guān)資料,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下

Mysql是我們?nèi)粘Ia(chǎn)與學習中最常接觸到的數(shù)據(jù)庫之一,今天講一講在Mysql(或者說其他類似的數(shù)據(jù)庫)中存在的隔離級別以及用來提高效率的多版本并發(fā)控制(MVCC)。

一、隔離級別

首先我們需要提到一個概念:事務(wù)。什么是事務(wù)?事務(wù)就是完成一個基礎(chǔ)操作的一系列操作語句的一個集合。例如我要將200元從賬戶A轉(zhuǎn)移到賬戶B,那么我可能會進行一下的操作:
a.驗證賬戶A中的余額是否大于200元。
b.將賬戶A中的余額減200元。
c.將賬戶B中的余額加200元。
我們就將上面的abc三個操作成為一個事務(wù)。
這時,我們會注意到我們所說的一個事務(wù)有可能是由多條語句組合而成的,而事務(wù)又存在原子性,即事務(wù)的執(zhí)行過程中是不能被打斷的,這就帶來一個問題,如果在這三步執(zhí)行過程中有另外的語句插入進來執(zhí)行,是否會對結(jié)果產(chǎn)生影響,因為此時破壞了事務(wù)的原子性。而這種插入的情況在并發(fā)的環(huán)境下是十分常見的。因此,我們(或者說是數(shù)據(jù)庫引擎)就需要在一個事務(wù)的執(zhí)行過程中對它進行“保護”,即保證外界的其他事務(wù)的語句不能隨意的插進正在執(zhí)行的事務(wù)語句之中,來保證事務(wù)的正常執(zhí)行。這時候我們很容易的會想到“加鎖”這個方法。這其實是一種很籠統(tǒng)的說法,因為加鎖雖然能夠保證事務(wù)的正常執(zhí)行,但是卻會帶來較大的額外開銷,因此合適的時候選擇合適的加鎖方式對查找效率的影響就非常大。而“鎖”得嚴不嚴,就區(qū)分除了集中不同的隔離級別。

READ UNCOMMITED(讀未提交)

這種隔離界別下,讀取數(shù)據(jù)的時候不受任何影響。即你甚至可以讀取一個正在被其他事務(wù)修改的數(shù)據(jù),想讀就讀,想改就改。這當然開銷很小,但是會帶來許多的問題,比如“臟讀”。即讀取到了正在修改但是卻還沒有提交的數(shù)據(jù),這就會造成數(shù)據(jù)讀取的錯誤。從性能上來說,READ UNCOMMITED不會比其他級別好太多,但是卻帶來了非常多的麻煩的問題,因此在實際中很少使用這個個立即被。

READ COMMITED(提交讀/不可重復讀)

這個級別在READ UNCOMMITED的基礎(chǔ)上添加了一些規(guī)定,是一些數(shù)據(jù)庫的默認隔離級別。它與READ UNCOMMITED的區(qū)別在于,它規(guī)定讀取的時候讀到的數(shù)據(jù)只能是提交后的數(shù)據(jù)。舉個例子,數(shù)據(jù)a在上一次提交之后的值是1,這時候有一個線程進來對a進行修改,將a修改為2,但是此時并未提交事務(wù)(COMMIT),在這種情況下,READ UNCOMMITED級別下讀取到的a的值就是當前的2,但是READ COMMITED級別下讀取到的還是上一次提交之后的值,即a為1,必須到修改線程將a的值變?yōu)?這個事務(wù)提交之后讀取到的a的值才是2。這個級別所帶來的問題就是不可重復讀。即上一個時間讀取到的a的值是1,但是隨著修改線程對事務(wù)的提交,a的值變?yōu)榱?,這時候讀到的值就是2了,即執(zhí)行兩次相同的讀取操作得到的值卻不一樣。
不可重復讀同臟讀的區(qū)別在于,臟讀是一個事務(wù)讀取了另一未完成的事務(wù)執(zhí)行過程中的數(shù)據(jù),而不可重復讀是一個事務(wù)執(zhí)行過程中,另一事務(wù)提交并修改了當前事務(wù)正在讀取的數(shù)據(jù)。

REPEATED READ(可重復讀)

REPEATED READ在READ COMMITED的基礎(chǔ)上又添加了一些約束性的規(guī)則,它也是MySQL數(shù)據(jù)庫的默認隔離級別。簡單來說就是在一個事務(wù)的執(zhí)行期間禁止其他事務(wù)對相應(yīng)的數(shù)據(jù)進行修改,這就徹底使得一個事務(wù)的執(zhí)行過程中所查詢到的數(shù)據(jù)一定是一致的,即解決了臟讀和不可重復讀的問題,但是卻帶來了新的問題,即“幻讀”。
“幻讀”指的是在一個事務(wù)執(zhí)行過程中雖然禁止了對相應(yīng)數(shù)據(jù)的修改,但是其他的事務(wù)依然可以插入數(shù)據(jù),這時候第一個事務(wù)就會發(fā)現(xiàn)會“莫名其妙”多出來一些數(shù)據(jù),像是出現(xiàn)了幻覺似的?;米x和不可重復讀都是讀取了另一條已經(jīng)提交的事務(wù)(這點同臟讀不同),所不同的是不可重復讀查詢的都是同一個數(shù)據(jù)項,而幻讀針對的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個數(shù))。

SERIALIZABLE (可串行化)

這是最嚴格的一個隔離級別。它通過強制事務(wù)串行執(zhí)行,避免了幻讀的問題。但是這種隔離級別的開銷極大,一般也不常使用。

各種隔離級別與可能的問題關(guān)系如下:

隔離級別 臟讀 不可重復讀 幻讀 加鎖
READ UNCOMMITED YES YES YES NO
READ COMMITED NO YES YES NO
REPEATED READ NO NO YES NO
SERIALIZABLE NO NO NO YES

二、MVCC

試想一下,如果每次SQL操作為了保證數(shù)據(jù)的一致性與準確性,都需要加一個行級鎖的話,非??煽?,但是帶來的系統(tǒng)開銷與查找效率的下降也是非常明顯的,因此MVCC就是為了解決這種矛盾而產(chǎn)生的。
首先MVCC會在表中的每一行記錄后面保存兩個隱藏的列,一個保存行的創(chuàng)建時間,一個保存行的過期(刪除)時間。這個時間值并不是真的時間,而是一個系統(tǒng)版本號。事務(wù)開始的時刻的系統(tǒng)版本號作為事務(wù)的版本號,用來和查詢到的每行記錄的版本號進行比較。

  • INSERT:為新插入的每一行保存當前的系統(tǒng)版本號作為行版本號。
  • DELETE:為刪除的每一行保存當前的系統(tǒng)版本號最為行刪除版本號。
  • UPDATE:更新其實應(yīng)該理解為插入一條新的數(shù)據(jù),并刪除原來數(shù)據(jù)的過程,即為新插入的數(shù)據(jù)保存當前的系統(tǒng)版本號作為行版本號,并為刪除的數(shù)據(jù)保存當前的系統(tǒng)版本號作為刪除版本號。
  • SELECT:只查詢滿足下列條件的行:

a.行版本號小于等于事務(wù)版本號
b.刪除版本號未定義或者大于事務(wù)版本號

保存了這兩個版本號之后絕大多數(shù)的操作都可以在不加鎖的情況下進行正確的操作,保證了性能和效率。
值得注意的是MVCC只在READ COMMITED和REPEATABLE READ兩個隔離級別下工作。

以上就是詳解MySQL 數(shù)據(jù)庫隔離級別與MVCC的詳細內(nèi)容,更多關(guān)于MySQL 數(shù)據(jù)庫隔離級別與MVCC的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mysql多表關(guān)聯(lián)更新方式

    Mysql多表關(guān)聯(lián)更新方式

    這篇文章主要介紹了Mysql多表關(guān)聯(lián)更新方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 詳解MySQL 外鍵約束

    詳解MySQL 外鍵約束

    這篇文章主要介紹了MySQL 外鍵約束的相關(guān)資料,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下
    2020-08-08
  • mysql?子查詢的概述和分類及單行子查詢功能實現(xiàn)

    mysql?子查詢的概述和分類及單行子查詢功能實現(xiàn)

    本文詳細介紹了MySQL的子查詢概念和應(yīng)用,解釋了子查詢是在主查詢中嵌套另一個查詢,包括外查詢和內(nèi)查詢,并從多個角度進行分類,文章還深入探討了子查詢的編寫技巧和使用場景,對于學習和應(yīng)用MySQL的人來說,這是一篇非常有價值的指南
    2024-10-10
  • MySQL基礎(chǔ)入門之Case語句用法實例

    MySQL基礎(chǔ)入門之Case語句用法實例

    case語句是mysql中的一個條件語句,可以在字段中使用case語句進行復雜的篩選以及構(gòu)造新的字段,下面這篇文章主要給大家介紹了關(guān)于MySQL基礎(chǔ)入門之Case語句用法的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • mysql觸發(fā)器之創(chuàng)建使用觸發(fā)器簡單示例

    mysql觸發(fā)器之創(chuàng)建使用觸發(fā)器簡單示例

    這篇文章主要介紹了mysql觸發(fā)器之創(chuàng)建使用觸發(fā)器,結(jié)合實例形式分析了mysql創(chuàng)建、查看、調(diào)用觸發(fā)器的相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • 關(guān)于MySQL 優(yōu)化的100個的建議

    關(guān)于MySQL 優(yōu)化的100個的建議

    MYSQL 如此方便和穩(wěn)定,以至于我們在開發(fā) WEB 程序的時候很少想到它。即使想到優(yōu)化也是程序級別的,比如,不要寫過于消耗資源的 SQL 語句。但是除此之外,在整個系統(tǒng)上仍然有很多可以優(yōu)化的地方。
    2016-01-01
  • insert...on?duplicate?key?update語法詳解

    insert...on?duplicate?key?update語法詳解

    本文主要介紹了insert...on?duplicate?key?update語法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • mysql安裝配置方法圖文教程(CentOS7)

    mysql安裝配置方法圖文教程(CentOS7)

    這篇文章主要為大家詳細介紹了centos7下mysql安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • win10 mysql 5.6.35 winx64免安裝版配置教程

    win10 mysql 5.6.35 winx64免安裝版配置教程

    這篇文章主要為大家詳細介紹了win10 mysql 5.6.35 winx64免安裝版配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • MySQL 數(shù)據(jù)庫連接池爆滿問題解決

    MySQL 數(shù)據(jù)庫連接池爆滿問題解決

    MySQL數(shù)據(jù)庫連接池爆滿會嚴重影響系統(tǒng)性能,通過應(yīng)用日志、數(shù)據(jù)庫連接池監(jiān)控面板等工具確認問題,具有一定的參考價值,感興趣的可以了解一下
    2024-11-11

最新評論

东平县| 克东县| 屏边| 南城县| 揭东县| 开平市| 武鸣县| 垦利县| 南京市| 石嘴山市| 宁强县| 广元市| 濮阳市| 修水县| 郯城县| 汾西县| 井研县| 县级市| 惠水县| 乳山市| 山丹县| 新乡市| 宝山区| 鲁甸县| 泗水县| 德钦县| 西乌珠穆沁旗| 绥滨县| 普定县| 二连浩特市| 卢氏县| 香格里拉县| 芦溪县| 衡东县| 阿克陶县| 舒城县| 岳池县| 读书| 通化市| 湖南省| 巧家县|