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

我们都知道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] 这个区间的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值