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ù)讀,幻讀
小結(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)加鎖,鎖定一條記錄 間隙鎖:
間隙鎖的目的是為了防止幻讀 innodb自動(dòng)使用間隙鎖的條件:
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ù)所持有。 死鎖
死鎖本質(zhì)上就是持有鎖和釋放鎖的問題,就像這個(gè)視頻里描述的,面試官在聽到死鎖的解釋后,才會(huì)釋放offer這個(gè)鎖,而應(yīng)聘者是得到offer后才會(huì)釋放死鎖解釋這個(gè)鎖。offer和對死鎖的解釋就可以類比兩個(gè)鎖。 死鎖的狀態(tài)就是互相等待。 |
|