這個(gè)問(wèn)題涉及到mysql的術(shù)語(yǔ)有臟讀,讀寫鎖,事務(wù)隔離級(jí)別,下面一一來(lái)解釋。
臟讀:事務(wù)一修改數(shù)據(jù)中的記錄時(shí),事務(wù)還沒(méi)提交,這時(shí)候事務(wù)二正好讀取到了這條修改過(guò)的數(shù)據(jù),然后事務(wù)一因?yàn)槟承┰蚴聞?wù)回滾,數(shù)據(jù)回到了原來(lái)的狀態(tài),事務(wù)二讀到的數(shù)據(jù)就是臟數(shù)據(jù),整個(gè)過(guò)程就是臟讀!
不可重復(fù)讀:事務(wù)一在一個(gè)事務(wù)中多次讀取同樣的數(shù)據(jù),這時(shí)候另一個(gè)事務(wù)剛好在修改數(shù)據(jù),導(dǎo)致事務(wù)一多次獲取到的數(shù)據(jù)不一致,這就是不可重復(fù)讀!不可重復(fù)讀通常出現(xiàn)在update中!
幻讀:幻讀:事務(wù)一先根據(jù)條件獲取到M條數(shù)據(jù),然后事務(wù)二又增加或減少了N條數(shù)據(jù),導(dǎo)致事務(wù)一再次搜索的時(shí)候發(fā)現(xiàn)多了或者少了N條數(shù)據(jù),也就是發(fā)生了幻讀。通常出現(xiàn)在insert或者delete中!
下面來(lái)看看mysql中的鎖:
寫鎖(排它鎖):獲取到排它鎖的事務(wù)可以對(duì)數(shù)據(jù)進(jìn)行任何操作,而且別的事務(wù)不能獲取到數(shù)據(jù)的任何其他鎖!
讀鎖(共享鎖):所有事務(wù)都可以公平的獲取到數(shù)據(jù)的共享鎖,進(jìn)行數(shù)據(jù)的讀取!
事務(wù)隔離級(jí)別有以下幾種,讀未提交,讀已提交,可重復(fù)讀,串行化,分別會(huì)對(duì)鎖進(jìn)行不同的控制,
如果mysql開(kāi)啟的事務(wù)隔離級(jí)別是讀未提交,也就相當(dāng)于沒(méi)有鎖,數(shù)據(jù)隨便讀,很容易就能讀到臟數(shù)據(jù),容易出現(xiàn)臟讀的現(xiàn)象,生產(chǎn)環(huán)境肯定不能用這樣的事務(wù)隔離級(jí)別!
所以需要保證數(shù)據(jù)安全并兼容性能,就需要根據(jù)場(chǎng)景選擇不同的事務(wù)傳播級(jí)別,因?yàn)閿?shù)據(jù)錯(cuò)誤主要出現(xiàn)在臟讀,生產(chǎn)中大多數(shù)用的是讀已提交事務(wù)傳播級(jí)別!