在使用MySQL數(shù)據(jù)庫(kù)時(shí),我們可能會(huì)遇到刪除數(shù)據(jù)后再次查詢(xún)時(shí)出現(xiàn)一些問(wèn)題的情況。
例如:
DELETE FROM table WHERE id=1; SELECT * FROM table WHERE id=1;
在執(zhí)行這兩條語(yǔ)句后,我們會(huì)發(fā)現(xiàn)第二條查詢(xún)語(yǔ)句并沒(méi)有返回空結(jié)果,而是返回了之前刪除過(guò)的數(shù)據(jù)。
這是因?yàn)镸ySQL中有一個(gè)特性叫做“事務(wù)隔離級(jí)別”,用于控制數(shù)據(jù)庫(kù)并發(fā)事務(wù)的隔離程度。而在默認(rèn)的隔離級(jí)別下(即可重復(fù)讀),在一個(gè)事務(wù)中,查詢(xún)語(yǔ)句會(huì)讀取之前查詢(xún)語(yǔ)句已經(jīng)讀取過(guò)的數(shù)據(jù),而不會(huì)重新讀取最新的數(shù)據(jù)。
因此,在刪除數(shù)據(jù)后再次查詢(xún)時(shí),可能會(huì)出現(xiàn)讀取到已刪除的數(shù)據(jù)的情況。
解決這個(gè)問(wèn)題的方法是修改事務(wù)隔離級(jí)別,可以將隔離級(jí)別改為“讀已提交”,即每次查詢(xún)都會(huì)讀取最新的數(shù)據(jù)。
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; DELETE FROM table WHERE id=1; SELECT * FROM table WHERE id=1;
在執(zhí)行完以上三條語(yǔ)句后,查詢(xún)結(jié)果會(huì)返回空。
除了修改事務(wù)隔離級(jí)別,還可以在刪除數(shù)據(jù)后手動(dòng)提交事務(wù),再進(jìn)行查詢(xún)操作:
START TRANSACTION; DELETE FROM table WHERE id=1; COMMIT; SELECT * FROM table WHERE id=1;
這樣,刪除操作和查詢(xún)操作就處于不同的事務(wù)中,避免了查詢(xún)讀取已刪除數(shù)據(jù)的問(wèn)題。