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