MySQL事務(wù)是指一組sql操作作為一個(gè)整體進(jìn)行操作,要么全部操作成功,要么全部操作失敗。MySQL事務(wù)隔離級(jí)別可以保證事務(wù)在并發(fā)環(huán)境下的正確性。
MySQL事務(wù)的隔離級(jí)別分為4種:讀未提交(read uncommitted)、讀已提交(read committed)、可重復(fù)讀(repeatable read)、串行化(serializable)。
讀未提交(read uncommitted):允許臟讀,事務(wù)未提交前,其他事務(wù)可以看到該事務(wù)的未提交的數(shù)據(jù)修改,會(huì)導(dǎo)致讀到臟數(shù)據(jù)。事務(wù)隔離級(jí)別最低。
讀已提交(read committed):不允許臟讀,事務(wù)提交后才能被其他事務(wù)看到,遵循數(shù)據(jù)一致性原則。但是可能會(huì)出現(xiàn)不可重復(fù)讀和幻讀問題。
可重復(fù)讀(repeatable read):在一個(gè)事務(wù)內(nèi),多次讀取同一個(gè)數(shù)據(jù),讀取的結(jié)果是一致的。當(dāng)事務(wù)內(nèi)對(duì)數(shù)據(jù)進(jìn)行修改時(shí),會(huì)對(duì)數(shù)據(jù)進(jìn)行加鎖,鎖會(huì)在事務(wù)結(jié)束后釋放。可重復(fù)讀隔離級(jí)別時(shí)MySQL的默認(rèn)隔離級(jí)別。
串行化(serializable):對(duì)于同一份數(shù)據(jù),串行化級(jí)別保證最高的隔離性,需要對(duì)數(shù)據(jù)進(jìn)行加鎖,直到當(dāng)前事務(wù)完成才解鎖。相當(dāng)于在并發(fā)環(huán)境下強(qiáng)制事務(wù)串行執(zhí)行,會(huì)導(dǎo)致大量鎖等待,性能較低。
MySQL事務(wù)的隔離級(jí)別雖然能夠保證事務(wù)的正確性,但是也需要根據(jù)實(shí)際情況進(jìn)行選擇,避免依賴過高的隔離級(jí)別而導(dǎo)致性能下降。