MySQL通过REPEATABLE READ隔离级别下的MVCC和间隙锁防止幻读,执行范围查询时锁定索引间隙,阻止其他事务插入新数据;若需更强一致性,可使用SERIALIZABLE级别使事务串行执行,或在关键查询中显式使用FOR UPDATE加临键锁,确保数据一致性。

MySQL 通过事务隔离级别和锁机制来防止幻读,关键在于正确选择隔离级别并理解其底层实现。
什么是幻读
幻读是指在一个事务中,前后两次执行相同的查询,第二次查询出现了第一次没有的结果行(通常是其他事务插入的新数据)。这在涉及范围查询时尤为明显。
使用可重复读(REPEATABLE READ)隔离级别
MySQL 默认的隔离级别是 REPEATABLE READ,在这个级别下,InnoDB 引擎通过 多版本并发控制(MVCC) 和 间隙锁(Gap Lock) 来防止幻读。
说明:MVCC 保证事务在执行期间看到的数据一致性,不会读到其他事务提交的新版本数据。当执行范围查询(如 SELECT * FROM users WHERE age > 20)时,InnoDB 不仅会对已有记录加锁,还会对索引间的“间隙”加锁,防止其他事务插入符合条件的新记录。
例如:事务 A 查询 age > 20 的用户,InnoDB 会锁定相关索引范围,事务 B 无法插入 age=25 的新用户,从而避免幻读。
使用串行化(SERIALIZABLE)隔离级别
如果需要更强的一致性保障,可以将事务隔离级别设为 SERIALIZABLE。
彩葫芦
用AI生成故事漫画、科普绘本、小说插画,加入彩葫芦绘画社区,一起释放创造力!
111 查看详情
特点:所有查询都会自动加上共享锁,写操作需要排他锁。事务完全串行执行,杜绝了幻读、不可重复读和脏读。但并发性能下降明显,只适用于对一致性要求极高且并发量不大的场景。
设置方式:SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
合理使用锁机制
在 REPEATABLE READ 下,如果想显式防止幻读,可以在关键查询中使用 临键锁(Next-Key Lock),它是记录锁和间隙锁的组合。
示例:执行 SELECT * FROM users WHERE age > 30 FOR UPDATE; 时,InnoDB 会锁定满足条件的记录以及它们之间的间隙,阻止新数据插入。这样即使其他事务尝试插入 age=35 的记录,也会被阻塞直到当前事务结束。
基本上就这些。MySQL 在默认隔离级别下已经能有效防止大多数幻读场景,关键是理解 MVCC 和间隙锁的作用机制,并在必要时通过 FOR UPDATE 或提升隔离级别来加强控制。
以上就是mysql事务如何防止幻读的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/768012.html
微信扫一扫
支付宝扫一扫