這是我寫(xiě)的第18封信遇汞,我們會(huì)遇到很多事情,很多事情都來(lái)妨礙我們的計(jì)劃簿废,我們的計(jì)劃也要跟得上變化空入,沒(méi)有什么計(jì)劃應(yīng)該是一成不變的。比方說(shuō)捏鱼,我想每天早上8點(diǎn)到8點(diǎn)30之間來(lái)更新执庐,但這周就拼拼需要早點(diǎn)去上班酪耕,8點(diǎn)就出門(mén)趕地鐵去了导梆。
MySQL當(dāng)前讀
有一個(gè)場(chǎng)景,我就有疑惑過(guò):既然MySQL在事務(wù)的過(guò)程中實(shí)現(xiàn)了多版本并發(fā)控制迂烁,能讀取的數(shù)據(jù)就應(yīng)該是小于等于當(dāng)前的數(shù)據(jù)版本看尼,那為什么寫(xiě)的場(chǎng)景能夠把數(shù)據(jù)寫(xiě)正確呢?
假設(shè)id 是1的記錄score初始值為0盟步,左邊的事務(wù)執(zhí)行完成之后藏斩,score的結(jié)果是5而不是2。
如果只從多版本并發(fā)控制上來(lái)說(shuō)却盘,有點(diǎn)摸不著頭腦狰域。
如果我這樣理解,多版本是用來(lái)解決讀一致問(wèn)題的黄橘,對(duì)于寫(xiě)的場(chǎng)景兆览,多版本并不能控制。但其實(shí)寫(xiě)的場(chǎng)景里也包含讀的部分塞关,MySQL要更新一行記錄抬探,總得先把記錄讀取出來(lái),更新完成之后帆赢,再寫(xiě)入內(nèi)存小压。
從單條語(yǔ)句上來(lái)分析线梗,MySQL 寫(xiě)就是寫(xiě),它是一個(gè)完整的事務(wù)怠益,而不會(huì)因?yàn)樗鼉?nèi)部有讀的邏輯仪搔,而拆分成兩個(gè)事務(wù)。
這就是寫(xiě)場(chǎng)景的當(dāng)前讀蜻牢,寫(xiě)場(chǎng)景讀取的數(shù)據(jù)一定是最新版本的數(shù)據(jù)僻造。所以,例子中左邊的事務(wù)其實(shí)會(huì)阻塞孩饼,直到右邊的事務(wù)執(zhí)行完畢髓削。
在對(duì)查詢語(yǔ)句加鎖的訪問(wèn),比如镀娶,for update 立膛,觸發(fā)的也是當(dāng)前讀。當(dāng)前讀就可能會(huì)有阻塞等待的情況梯码。