日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

MySQL事務(wù)和鎖——《MySQL DBA工作筆記》

 小仙女本仙人 2022-05-02 發(fā)布于北京

MySQL事務(wù)

事務(wù)存在的原因

事務(wù)存在的目的:保證用戶對數(shù)據(jù)操作對數(shù)據(jù)是安全的。(比如說銀行卡余額)

事務(wù)的特性——ACID

原子性:一個(gè)事務(wù)要么全部執(zhí)行,要么不執(zhí)行

一致性:事務(wù)開始和結(jié)束時(shí),數(shù)據(jù)保持一致

隔離性:事務(wù)之間互不影響

持久性:事務(wù)操作的結(jié)果具有持久性

關(guān)于臟讀,不可重復(fù)讀,幻讀

  • 臟讀

    事務(wù)A讀取了事務(wù)B中尚未提交的數(shù)據(jù)。如果事務(wù)B回滾,則A讀取使用了錯(cuò)誤的數(shù)據(jù)。

    【一個(gè)事物在讀的時(shí)候,禁止讀取未提交的事務(wù)】

  • 不可重復(fù)讀

    不可重復(fù)讀是指在一個(gè)事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于存在查詢間隔,被另一個(gè)事務(wù)修改并提交了。

    【一個(gè)事物在讀的時(shí)候,禁止任何事務(wù)寫】

  • 幻讀

    在事務(wù)A多次讀取過程中,事務(wù)B對數(shù)據(jù)進(jìn)行了新增操作,導(dǎo)致事務(wù)A多次讀取的數(shù)據(jù)不一致。

    【一個(gè)事物加上表級(jí)鎖,禁止任何操作的并發(fā)】

小結(jié):

臟讀是讀取了尚未提交的數(shù)據(jù),不可重復(fù)讀是讀取了不停更新的數(shù)據(jù)(修改),幻讀是指讀取了不停更新的數(shù)據(jù)(新增)。

關(guān)于事務(wù)隔離級(jí)別

目的:避免臟讀,不可重復(fù)讀,幻讀

讀未提交:一個(gè)事務(wù)可以讀到另一個(gè)事務(wù)尚未提交的數(shù)據(jù)。也就是臟讀,避免臟讀的方式:

讀提交:一個(gè)事務(wù)要等另一個(gè)事務(wù)提交后才能讀取數(shù)據(jù)。但會(huì)導(dǎo)致一個(gè)事務(wù)中相同查詢出現(xiàn)不同的結(jié)果。也就是不可重復(fù)讀。避免不可重復(fù)讀的方式:

重復(fù)讀(RR,MySQL默認(rèn)級(jí)別):就是在開始讀取數(shù)據(jù)時(shí),不允許修改操作。但會(huì)導(dǎo)致由于允許insert操作導(dǎo)致的事務(wù)結(jié)果出現(xiàn)不同。也就是幻讀,避免幻讀的方式::

序列化:序列化使事務(wù)串行順序執(zhí)行,但會(huì)大大降低并發(fā)性能。

MySQL鎖機(jī)制

Innodb實(shí)現(xiàn)了兩種類型的行鎖:共享鎖,排他鎖。

共享鎖和排他鎖

共享鎖:允許一個(gè)事務(wù)讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖,多個(gè)共享鎖是可以并行的。

排他鎖:獲取排他鎖的事務(wù)允許更新數(shù)據(jù),阻止其他事務(wù)獲取相同數(shù)據(jù)集的共享鎖和排他鎖。

【復(fù)述一下】

假設(shè)事務(wù)A獲取了表中的行666,就相當(dāng)于獲得了共享鎖,此時(shí)A可以讀取數(shù)據(jù),其他事務(wù)也可以獲得行666的共享鎖,所以多個(gè)共享鎖是可以并行指的是多個(gè)事務(wù)可以讀取相同的行,但是一旦某行被獲取了共享鎖,就無法被其他事務(wù)獲取排他鎖,也就是說,行只能讀,不能寫。

然后A讀完了,事務(wù)B要對行666進(jìn)行更新操作,就需要先獲得排他鎖,獲得排他鎖之后,其他事務(wù)就無法獲取行666的排他鎖和共享鎖,也就是說,在事務(wù)B更新數(shù)據(jù)的時(shí)候不允許其他事務(wù)讀或者更新。

所以排他鎖就是指只允許一個(gè)事務(wù)進(jìn)行寫操作,在這個(gè)過程中,不允許其他事務(wù)讀,也不允許其他事務(wù)寫。

也就是說,排他鎖是串行的,不能被多個(gè)事務(wù)同時(shí)持有,但共享鎖可以。

【如何使用行鎖】

InnoDB行鎖是通過索引上的索引項(xiàng)來實(shí)現(xiàn)的,InnoDB這種行鎖實(shí)現(xiàn)特點(diǎn)意味者:只有通過索引條件檢索數(shù)據(jù),InnoDB才會(huì)使用行級(jí)鎖,否則,InnoDB將使用表鎖!(這也是為什么需要進(jìn)行索引優(yōu)化的原因)

【行鎖定的范圍問題】

行鎖:對索引項(xiàng)加鎖,鎖定一條記錄

間隙鎖:

編程的思想源于生活,生活中的例子能幫助我們更好的理解一些編程中的思想。
生活中排隊(duì)的場景,小明,小紅,小花三個(gè)人依次站成一排,此時(shí),如何讓新來的小剛不能站在小紅旁邊,這時(shí)候只要將小紅和她前面的小明之間的空隙封鎖,將小紅和她后面的小花之間的空隙封鎖,那么小剛就不能站到小紅的旁邊。
這里的小紅,小明,小花,小剛就是數(shù)據(jù)庫的一條條記錄。
他們之間的空隙也就是間隙,而封鎖他們之間距離的鎖,叫做間隙鎖。

間隙鎖的目的是為了防止幻讀

innodb自動(dòng)使用間隙鎖的條件:

  • 必須在RR級(jí)別下
  • 檢索條件必須有索引(沒有索引的話,mysql會(huì)全表掃描,那樣會(huì)鎖定整張表所有的記錄,包括不存在的記錄,此時(shí)其他事務(wù)不能修改不能刪除不能添加)

Next-key Lock:等于行鎖加間隙鎖。掃描索引記錄后,先對索引記錄加上行鎖,再對索引兩邊的間隙加上間隙鎖。

意向共享鎖和意向排他鎖

Innodb雖然使用行鎖,但并沒有廢棄表鎖。

行鎖和表鎖】

MyISAM存儲(chǔ)引擎使用的是表鎖,而Innodb增加了行鎖。并不意味著Innodb徹底拋棄了表鎖。

關(guān)于行鎖,較小的粒度導(dǎo)致其高并發(fā),但也因較小的粒度導(dǎo)致加鎖慢,開銷大,會(huì)出現(xiàn)死鎖情況。

關(guān)于表鎖,較大的粒度在高并發(fā)上的表現(xiàn)很弱,但同時(shí)粒度較大,加鎖塊,開銷小,不會(huì)出現(xiàn)死鎖情況。

沒有完美的技術(shù),只有合適的解決方案。在高并發(fā)場景下使用行鎖而忍受一些問題本質(zhì)上是一種權(quán)衡。

意向鎖的背景沖突】

意向鎖的出現(xiàn)本質(zhì)上是解決行鎖和表鎖矛盾的問題。

事務(wù)A獲得了表中某一行的共享鎖,事務(wù)B申請了表的寫權(quán)限,這時(shí)候就會(huì)產(chǎn)生矛盾。

關(guān)于意向鎖】

首先,意向鎖是一種表鎖。

意向共享鎖:事務(wù)獲得表中的某一行的共享鎖前,需要先獲得整張表的意向共享鎖。

意向排他鎖:事務(wù)獲得表中的某一行的排他鎖前,需要先獲得整張表的意向排他鎖。

意向鎖的加鎖過程是自動(dòng)完成的。

【意向鎖的共享問題】

意向鎖是表鎖,它的互斥性是針對表級(jí)別的事務(wù),比如一個(gè)事務(wù)要獲取一張表的寫權(quán)限。所以意向鎖對于表級(jí)別的事務(wù)是互斥的。但是對于行級(jí)別的事務(wù)是共享的,也就是說,一個(gè)意向鎖可以被多個(gè)行級(jí)別的事務(wù)所持有。

死鎖

關(guān)于死鎖抖音上有一個(gè)非常好玩的小視頻:

面試官問:解釋一下死鎖,解釋明白了就發(fā)offer

應(yīng)聘者答:先發(fā)offer,發(fā)了offer再解釋

死鎖本質(zhì)上就是持有鎖和釋放鎖的問題,就像這個(gè)視頻里描述的,面試官在聽到死鎖的解釋后,才會(huì)釋放offer這個(gè)鎖,而應(yīng)聘者是得到offer后才會(huì)釋放死鎖解釋這個(gè)鎖。offer和對死鎖的解釋就可以類比兩個(gè)鎖。

死鎖的狀態(tài)就是互相等待。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多