什么是事物:
? ? ? ?因?yàn)闃I(yè)務(wù)的需要,mysql需要引入事物的概念(此概念不做具體介紹)
事物并發(fā)產(chǎn)生的問題 :
? ? ? ?事物并發(fā)執(zhí)行的時(shí)候會產(chǎn)生一些問題,如下
? ? ? ?臟讀:一個(gè)事物讀取到了例外一個(gè)事物沒有提交的數(shù)據(jù),如何此時(shí)例外一個(gè)事物回滾, 相當(dāng)于讀取到了臟數(shù)據(jù)
? ? ? ?不可重復(fù)讀:一個(gè)事物在讀取過程中 讀取到了其他事物修改的數(shù)據(jù),導(dǎo)致多次數(shù)據(jù)讀取不一致
? ? ? ?幻讀:一個(gè)事物在讀取過程中 讀取到了其他事物新增的數(shù)據(jù),導(dǎo)致多次數(shù)據(jù)讀取不一致
?解決方案:
? ? ? ? 一:可以通過加鎖的方式來解決上述問題,例如,讀的時(shí)候加共享鎖,此時(shí)其他事物無法修改相應(yīng)的數(shù)據(jù),寫的時(shí)候加排他鎖
禁止其他事物讀寫操作,但是這種做法性能較差
? ? ?二:基于性能的考慮 mysql?InnoDB引擎實(shí)現(xiàn)了 多版本并發(fā)控制(MVCC),這是一種樂觀鎖的實(shí)現(xiàn)方式;MVCC 在讀已提交 和 可重復(fù)讀 2種隔離級別下工作;
? ? ? ? ? ?在MVCC中,讀操作可以分成兩類,快照讀(Snapshot read)和當(dāng)前讀(current read)??煺兆x,讀取的是記錄的可見版本(可能是歷史版本,即最新的數(shù)據(jù)可能正在被當(dāng)前執(zhí)行的事務(wù)并發(fā)修改),不會對返回的記錄加鎖;而當(dāng)前讀,讀取的是記錄的最新版本,并且會對返回的記錄加鎖,保證其他事務(wù)不會并發(fā)修改這條記錄,所以說MVCC解決了不可重復(fù)讀的問題,因?yàn)楫?dāng)前讀讀取的是最新的版本,所以還是會出現(xiàn)幻讀的情況,
? ? ? ? ? Mysql通過間隙鎖的方式解決了 幻讀 的問題,一種鎖定索引記錄間隙,確保索引記錄的間隙不變的加鎖方式,間隙鎖僅發(fā)生于檢索條件有非唯一索引,RR級別下;唯一索引下 由于其唯一性,排序性沒有間隙
? ? ? ?