MySQL提供了4種隔離級(jí)別,其中可重復(fù)讀(RR)隔離級(jí)別是最常用的隔離級(jí)別之一,并且不會(huì)出現(xiàn)幻讀的問(wèn)題。但是,一些開(kāi)發(fā)人員和DBA又擔(dān)心使用可重復(fù)讀隔離級(jí)別會(huì)鎖住數(shù)據(jù)庫(kù),影響系統(tǒng)的性能。
其實(shí),使用可重復(fù)讀隔離級(jí)別不會(huì)鎖住數(shù)據(jù)庫(kù),這是由于RR隔離級(jí)別使用的鎖粒度很細(xì),只在需要時(shí)才會(huì)上鎖。具體來(lái)說(shuō),MySQL采用的是兩階段鎖定機(jī)制,除了SELECT語(yǔ)句之外的所有語(yǔ)句都會(huì)先獲取鎖。在RR隔離級(jí)別下,事務(wù)在讀取數(shù)據(jù)時(shí),會(huì)鎖定所讀取的記錄,但不會(huì)鎖定整張表,只會(huì)鎖定需要操作的行。也就是說(shuō),在RR隔離級(jí)別下,鎖的范圍是讀取的行而不是整張表。
/* 開(kāi)啟可重復(fù)讀隔離級(jí)別 */ SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; /* 查詢(xún)學(xué)生表 */ SELECT * FROM student WHERE age = 18;
總之,使用可重復(fù)讀隔離級(jí)別并不會(huì)對(duì)數(shù)據(jù)庫(kù)的性能造成太大的影響,但需要注意的是,如果事務(wù)太長(zhǎng)或者使用了太多的鎖,會(huì)導(dǎo)致性能下降。因此,在實(shí)際應(yīng)用中需要根據(jù)需求和業(yè)務(wù)場(chǎng)景來(lái)選擇合適的隔離級(jí)別。