Mysql事務(wù)

一、事務(wù)屬性

? ? 原子性(Atomicity):事務(wù)是一個(gè)原子操作單元,其對(duì)數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。(針對(duì)于操作層面)

? ??一致性(Consistent) :在事務(wù)開始和完成時(shí),數(shù)據(jù)都必須保持一致狀態(tài)。這意味著所有相關(guān)的數(shù)據(jù)規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持?jǐn)?shù)據(jù)的完整性。(針對(duì)于數(shù)據(jù)層面)

? ??隔離性(Isolation) :數(shù)據(jù)庫系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的“獨(dú)立”環(huán)境執(zhí)行。這意味著事務(wù)處理過程中的中間狀態(tài)對(duì)外部是不可見的,反之亦然。

? ??持久性(Durable) :事務(wù)完成之后,它對(duì)于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。

二、并發(fā)事務(wù)帶來的問題

? ? 更新丟失或者臟寫(Lost Update):當(dāng)兩個(gè)事務(wù)或者多個(gè)事務(wù)對(duì)同一條數(shù)據(jù)做更新時(shí),后面提交的數(shù)據(jù)會(huì)覆蓋前面的寫數(shù)據(jù);

????臟讀(Dirty Reads):事務(wù)A讀取到了還未提交事務(wù)B的數(shù)據(jù);

? ? 不可重復(fù)讀(Non-Repeatable Reads):事務(wù)A和事務(wù)B同時(shí)begin時(shí),事務(wù)B先提交了,事務(wù)A讀取到了事務(wù)B已提交的數(shù)據(jù);

? ? 幻讀(Phantom Reads):事務(wù)A和事務(wù)B同時(shí)begin時(shí),事務(wù)B先提交了,事務(wù)A讀取到了事務(wù)B已提交的新增數(shù)據(jù);

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

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

四、MVCC機(jī)制

讀已提交和可重復(fù)讀都是用了MVCC(Multi-Version Concurrency Control)機(jī)制;

首先mysql會(huì)為每一行數(shù)據(jù),多維護(hù)trx_id(事務(wù)id,一般是自增的)和roll_pointer(回滾指針,上一個(gè)版本的指針);再會(huì)維護(hù)一個(gè)undo日志,每當(dāng)數(shù)據(jù)有更新時(shí),先把歷史版本數(shù)據(jù)寫入undo日志,便于以后回滾;

undo日志結(jié)構(gòu)

MVCC機(jī)制:在事務(wù)開啟后,第一個(gè)查詢語句執(zhí)行之前,會(huì)把當(dāng)前數(shù)據(jù)庫存在的未提交事務(wù)放在一個(gè)readView集合中,獲取一個(gè)當(dāng)前數(shù)據(jù)庫最大的事務(wù)id(max_id);再從readView中選出最小的事務(wù)id(min_id);因?yàn)槭聞?wù)是自增的;所以當(dāng)事務(wù)開啟后,查詢到的數(shù)據(jù)

1.如果trx_id的版本號(hào)小于min_id則說明當(dāng)前這個(gè)版本號(hào)肯定是在我這個(gè)事務(wù)開啟前已提交的,則是可見的,可以查詢出來的數(shù)據(jù);

2.如果大于min_id且小于max_id,則需要去看是否在readView集合中,如果在該集合中,則該事務(wù)未提交,則是不可見的,需要根據(jù)roll_pointer去查找上個(gè)版本的數(shù)據(jù),直到查找到復(fù)核規(guī)則的數(shù)據(jù);

3.如果是大于max_id,因?yàn)槭聞?wù)id是自增的,則該事務(wù)肯定是我查詢之后才插入的數(shù)據(jù),所以該數(shù)據(jù)是不可見的,則需要查找上個(gè)版本數(shù)據(jù),直到查找到復(fù)核規(guī)則的數(shù)據(jù);

mysql默認(rèn)使用可重復(fù)讀級(jí)別,是上述規(guī)則;當(dāng)使用讀已提交,區(qū)別在于,每次查詢語句都會(huì)生成一個(gè)當(dāng)前的readView;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 事務(wù)定義及四大特性事務(wù)是什么?就是用戶定義的一系列數(shù)據(jù)庫操作,這些操作可以視為一個(gè)完成的邏輯處理工作單元,要么全部...
    葉葉阿姨閱讀 303評(píng)論 0 0
  • 1.ACID 2.隔離級(jí)別對(duì)應(yīng)的問題 1.SQL標(biāo)準(zhǔn)的情況下 2.這四種事務(wù)隔離級(jí)別是指定的SQL標(biāo)準(zhǔn),InnoD...
    zjkdifvpwlkqumn閱讀 258評(píng)論 0 0
  • 眾所周知,事務(wù)和鎖是mysql中非常重要功能,同時(shí)也是面試的重點(diǎn)和難點(diǎn)。本文會(huì)詳細(xì)介紹事務(wù)和鎖的相關(guān)概念及其實(shí)現(xiàn)原...
    阿杰子啊閱讀 1,314評(píng)論 0 0
  • 對(duì)于mysql中注重事務(wù)優(yōu)化的就是innodb引擎,我們學(xué)習(xí)一下innodb事務(wù); 什么是事務(wù)? 事務(wù)就是一系列的...
    Tim在路上閱讀 354評(píng)論 1 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,820評(píng)論 28 54

友情鏈接更多精彩內(nèi)容