mysql的mvcc + 间隙锁 可以杜绝幻读问题
-- 示例:Next-Key Lock防止幻读
START TRANSACTION;
-- 对范围查询加锁
SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE;
-- MySQL会锁定:
-- 1. 所有age在[20,30]的记录(记录锁)
-- 2. (上一个记录,20)和(30,下一个记录)的区间(间隙锁)
-- 3. 阻止其他事务在区间内插入
-- 此时其他事务执行:
-- INSERT INTO users(age) VALUES (25); -- 被阻塞!
-- INSERT INTO users(age) VALUES (35); -- 允许执行

浙公网安备 33010602011771号