MySQL select ** for update 之后就无法读?

你知道的越多,不知道的也越多!

想必大家早有所闻,在select语句后加上 for update 是mysql里的写锁(x锁),加上lock share in mode 是读锁(s锁)。

读锁:共享锁就是多个事务对于同一数据可以共享一把锁(其它事务可以抢占读锁),都能访问到数据,但是只能读不能修改;

写锁:排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排
他锁,其他事务就不能对该行记录做其他操作,也不能获取该行的锁。

那面对文章标题的灵魂拷问?到底可以读么?
答案: 可以读,可以读,可以读。只是不能抢锁。
Q: 为什么可以读?
A:难道忘记了在InnoDB引擎里,MySQL的MVCC机制么?多版本控制阿,会进行一次快照读。
在这里插入图片描述

Q:那为什么有人说无法读?
A:更具体点表述,应该是无法抢占任何锁,比如读锁

下面动手实践下:
在这里插入图片描述

打开两个命令窗口:
窗口1尝试加上for update 抢占写锁;
窗口2尝试加上 lock in share model 抢占读锁。
预期结果: 窗口2抢锁失败!
在这里插入图片描述
那窗口可以直接select查询到数据么? 可以的。

在这里插入图片描述

那试试共享读锁呗?
在这里插入图片描述

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值