MySQL事務(wù)能夠預(yù)防幻讀,這是因?yàn)榛米x的發(fā)生是由于多個事務(wù)同時修改同一行數(shù)據(jù)引起的。在并發(fā)的情況下,如果不通過事務(wù)來管理數(shù)據(jù),就難以避免可能導(dǎo)致幻讀的情況發(fā)生。
START TRANSACTION;
SELECT * FROM table WHERE column='value' FOR UPDATE;
// 這里執(zhí)行業(yè)務(wù)邏輯,例如修改數(shù)據(jù)
COMMIT;
在上面的代碼中,我們使用了FOR UPDATE語句來鎖定了查詢結(jié)果,避免了其他并發(fā)事務(wù)對相同的數(shù)據(jù)進(jìn)行修改。當(dāng)一個事務(wù)執(zhí)行完畢并提交時,另一個事務(wù)開始執(zhí)行時,就不會讀取到已被修改的數(shù)據(jù)。
此外,MySQL還提供了另一種鎖定方式:SELECT ... FOR SHARE,它允許多個事務(wù)同時讀取數(shù)據(jù),但在數(shù)據(jù)被修改時會阻止其他事務(wù)修改同一行數(shù)據(jù)。
START TRANSACTION;
SELECT * FROM table WHERE column='value' FOR SHARE;
// 這里執(zhí)行業(yè)務(wù)邏輯,例如讀取數(shù)據(jù)
COMMIT;
因此,通過使用事務(wù)和鎖定,MySQL能夠有效地預(yù)防幻讀,保證數(shù)據(jù)的一致性。