MySQL中的脏读与幻读:概念、影响与办理方案

[复制链接]
发表于 2025-10-18 16:17:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在数据库事件处理处罚中,脏读和幻读是两种常见的并发标题,大概导致数据差别等或逻辑错误。本文将联合实际场景,深入剖析两者的原理及办理方案。

一、脏读(Dirty Read)

1. 概念剖析

脏读指一个事件读取了另一个事件未提交的修改数据。若后续事件回滚,当前事件读取的数据即为无效值。比方:

  • 事件A修改用户余额但未提交;
  • 事件B读取该余额并表现;
  • 事件A回滚,事件B表现的数据即为脏数据。
2. 产生缘故原由


  • 低隔离级别:如读未提交(READ UNCOMMITTED)答应事件读取其他事件的未提交数据。
  • 缺乏锁机制:未对修改的数据加锁,导致并发事件辩说。
3. 办理方案

(1)调解事件隔离级别


  • 读已提交(READ COMMITTED):只答应读取已提交数据,克制脏读。
    1. #sql语句
    2. SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    复制代码
  • 可重复读(REPEATABLE READ):MySQL默认级别,通过多版本并发控制(MVCC)克制脏读。
(2)显式加锁


  • 使用SELECT ... FOR UPDATE对修改的数据加排他锁,制止其他事件修改。

二、幻读(Phantom Read)

1. 概念剖析

幻读指在同一事件中,两次雷同范围查询返回差别效果集(如新增或删除行)。比方:

  • 事件A查询年事>30的用户,效果为2人;
  • 事件B插入1名新用户(年事35)并提交;
  • 事件A再次查询,效果变为3人。
2. 产生缘故原由


  • 范围查询毛病:平常行锁无法锁定间隙,新数据大概插入。
  • 快照读与当前读差别:默认快照读(SELECT)不加锁,无法感知新增数据。
3. 办理方案

(1)提升隔离级别


  • 串行化(SERIALIZABLE):完全克制并发修改,克制幻读,但性能开销大。
  • 可重复读(REPEATABLE READ):MySQL通过**间隙锁(Gap Lock)**锁定查询范围,防止插入新数据。
(2)使用行级锁


  • 对范围查询加FOR UPDATE,锁定全部符合条件的行及间隙:
    1. #sql语句
    2. SELECT * FROM users WHERE age > 30 FOR UPDATE;
    复制代码
(3)乐观锁与MVCC


  • 乐观锁:通过版本号或时间戳检测辩说,实用于读多写少场景。
  • MVCC:多版本并发控制,读使用不加锁,写使用通过版本对比实现同等性。

三、隔离级别对比与选择发起

隔离级别脏读不可重复读幻读性能影响读未提交(RU)✔️✔️✔️最高读已提交(RC)❌✔️✔️较高可重复读(RR)❌❌✔️中等串行化(SR)❌❌❌最低

  • 互联网高并发场景:保举可重复读(RR)+间隙锁,平衡同等性与时效性。
  • 金融体系:使用串行化(SR)确保绝对安全,但需继续较低并发。

四、总结

脏读与幻读的本质是事件隔离性不敷导致的并发辩说。通过公道设置隔离级别、使用锁机制或MVCC,可有效办理标题。实际开发中需根据业务需求权衡同等性、性能与复杂度。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表