可重复读隔离级别下的幻读问题

本文详细介绍了MySQL的四种隔离级别,重点解析了在可重复读级别下出现幻读的原因,并通过实例展示了快照读与当前读的区别。在幻读问题上,解释了间隙锁如何防止幻读,以及其工作原理。当执行SELECT...FOR UPDATE语句时,如果条件列有索引,会锁住行,否则锁住表。通过理解间隙锁,可以更好地解决事务中的并发控制问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道mysql 一共有四种隔离级别

  • 读未提交
  • 读提交
  • 可重复读
  • 串行化
  • 可重复为默认级别 可重复又会产生幻读

可重复读隔离级别下的幻读问题

  • 可重复读又分为快照读 和 幻读

  • 快照读不会产出幻读问题

  • 普通 select 语句

  • 当前读会产生幻读问题

  • select … lock in share mode

  • select … for update

  • for update 表明需要看到最新的数据

  • update 、delete 、insert

  • for update 锁表还是锁行?

  • 当条件列有索引时锁行否则锁表

  • 啥是幻读?

  • 事物里边两个查询语句 前一次执行和后一次查询结果不行

  • 复现(假设d=5 只会锁住一行,假设假设!!重要的事情说3遍)

|       SessionA                     |     事物B         |
-------------------------------------------
    begin
-------------------------------------------------------------
select * from t where d=5 for update |
result(5,5,5)
-------------------------------------------------------------
                                     |update t set d=5  where    id =0
-------------------------------------------------------------
select * from t where d=5 for update |
result(0,0,5) (5,5,5)
-------------------------------------------------------------

- 
- # 我们可以清楚的看到由于事物B 修改了一条id=0 所以导致同一个事物中两次查询不一致

# 那么mysql是如何解决这个问题的?

-# mysql 引入了间隙锁
- 间隙锁不止锁住该行数据,还有锁住该值的间隙
- 举例

假设该表有如下数据

  • d 列值分别为1 5 10
  • select * from t where d=5 for update
  • 会锁住d=5 该行和 d=[1-10] 这个区间的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值