阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL的共享锁和独占锁

37次阅读
没有评论

共计 1158 个字符,预计需要花费 3 分钟才能阅读完成。

导读 当有人在更新数据时,其他事务可以读取这行数据吗?需要加锁吗?

多个事务同时更新一行数据,都会加锁,然后排队等待,必须一个事务执行完毕提交了,释放锁,才能唤醒下一个事务继续执行。那这多个事务运行时,加的啥锁?

MySQL 的共享锁和独占锁

是 X 锁,Exclude 独占锁,当有一个事务加了独占锁,此时其他事务再想更新这行数据,都要加独占锁,但只能暂时生成独占锁并在后面等待。

当有人在更新数据时,其他事务可以读取这行数据吗? 需要加锁吗?

不用,因为默认情况下,有人在更新数据时,然后你要去读取,直接默认就是开启 MVCC。即此时对一行数据的读、写两个操作默认不会加锁互斥,因为 MySQL 的 MVCC 就是为此设计,避免频繁加锁互斥。

此时你读取数据,完全可以根据你的 ReadView,去 undo log 版本链条里找个你能读的版本,而完全不用顾虑别人是否在更新。

就算你真的等他更新完毕并提交了,基于 MVCC,你也读不到他更新的值! 因为 ReadView 机制不允许,所以你默认情况下的读,完全无需加锁,不需要去关心其他事务的更新加锁问题,直接基于 MVCC 读某个快照即可。

万一要是你在执行查询操作时,偏想加锁呢?

也可以满足你,MySQL 支持共享锁,S 锁,语法如下:

select * from table lock in share mode

在查询语句后面加上 lock in share mode,意思就是查询的时候对一行数据加共享锁。若此时有别的事务在更新这行数据,已经加了独占锁,此时你的共享锁还能加吗?

若你先加了共享锁,然后别人来更新要加独占锁行吗?

当然不行了,此时锁互斥,他只能等待。

若你在加共享锁时,别人也加共享锁呢?
可以的,你们俩都可加共享锁,共享锁和共享锁不互斥。

所以更新数据时,必然加独占锁,独占锁和独占锁互斥,此时别人不能更新; 但若此时你要查询,默认不加锁,走 MVCC 读快照版本,但你查询是可以手动加共享锁的,共享锁和独占锁互斥,共享锁和共享锁不互斥。

一般开发业务系统的时候,其实你查询主动加共享锁很少见,数据库行锁虽然实用,但一般不会在数据库层面做复杂的手动加锁,反而会用基于 redis/zookeeper 的分布式锁来控制业务系统的锁逻辑。

查询操作还能加互斥锁:

select * from table for update

我查出来数据以后还要更新,此时我加独占锁了,其他闲杂人等,都不要更新这数据了!

一旦你查询时加独占锁,在你事务提交前,任何人都不能更新数据,只能你在本事务里更新数据,等你提交了,别人才能再更新数据。

总结

本文描述了默认情况下更新数据的独占锁,默认情况下查询数据的 mvcc 机制读快照,然后通过查询加共享锁和独占锁的方式,共享锁和独占锁之间的互斥规则。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1158字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中