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

Mysql中S 锁和 X 锁的区别

77次阅读
没有评论

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

导读 S 锁,英文为 Shared Lock,中文译作共享锁,有时候我们也称之为读锁,即 Read Lock。S 锁之间是共享的,或者说是互不阻塞的。

MySQL 中的锁还是蛮多的,在之前的文章中,松哥和大家介绍过 MySQL 中的 MDL 锁,今天我们再来看看 MySQL 中比较重要的两个锁:S 锁和 X 锁。

1. S 锁

S 锁,英文为 Shared Lock,中文译作共享锁,有时候我们也称之为读锁,即 Read Lock。S 锁之间是共享的,或者说是互不阻塞的。

当事务读取一条记录时,需要先获取该记录的 S 锁。

举个例子:

事务 T1 对记录 R1 加上了 S 锁,那么事务 T1 可以读取 R1 这一行记录,但是不能修改 R1,其他事务 T2 可以继续对 R1 添加 S 锁,但是不能添加 X 锁,只有当 R1 上面的 S 锁释放了,才能加上 X 锁。

举一个加 S 锁的例子,如下图:

Mysql 中 S 锁和 X 锁的区别

此时,对于 id=1 的这条记录,只能读取不能修改了。假设在另外一个事务 T 中,执行如下 SQL 是没问题的,因为 S 锁是共享锁,S 锁和 S 锁之间是兼容的:

select * from user where id=1 lock in share mode;

但是如果执行如下 SQL 则会被阻塞,因为修改数据需要获取 X 锁,而 S 锁和 X 锁不兼容:

update user set username='javaboy' where id=1;

上面这个更新语句内部会获取 X 锁,对于一些手动添加了 X 锁的查询语句,也会阻塞,例如下面这个:

Mysql 中 S 锁和 X 锁的区别

可以看到,这个 SQL 执行之后就被阻塞了。

2. X 锁

X 锁,英文为 Exclusive Lock,中文译作排他锁,有时候我们也称之为写锁,即 Write Lock。如同它的名字,X 锁是具有排他性的,即一个写锁会阻塞其他的 X 锁和 S 锁。

当事务需要修改一条记录时,需要先获取该记录的 X 锁。

举个例子:

事务 T1 对记录 R1 加上了 X 锁,那么事务 T1 即可以读取 R1 也可以修改 R1,而其他事务则不能对 R1 再添加任何锁,直到 T1 释放了 R1 上的锁。

如上文图示,锁定读的格式是这样的:

select .... for update;
3. 当前读与快照读

由上面这两种锁,又引申出来两种读:

3.1 快照读

快照读 (SnapShot Read) 是一种一致性不加锁的读,是 InnoDB 存储引擎并发如此之高的核心原因之一。

在可重复读的隔离级别下,事务启动的时候,就会针对当前库拍一个照片(快照),快照读读取到的数据要么就是拍照时的数据,即事务开启那一瞬间数据库中的数据,要么就是当前事务自身插入 / 修改过的数据。

我们日常所用的不加锁的查询,都属于快照读,这个我就不演示了。

3.2 当前读

与快照读相对应的就是当前读,当前读就是读取最新数据,而不是历史版本的数据,换言之,在可重复读隔离级别下,如果使用了当前读,也可以读到别的事务已提交的数据。

松哥举个例子:

MySQL 事务开启两个会话 A 和 B。

首先在 A 会话中开启事务并查询 id 为 1 的记录:

Mysql 中 S 锁和 X 锁的区别

接下来我们在 B 会话中对 id 为 1 的数据进行修改,如下:

Mysql 中 S 锁和 X 锁的区别

注意 B 会话不要开启事务或者开启了及时提交事务,否则 update 语句占用一把排他锁会导致一会在 A 会话中用锁时发生阻塞。

接下来,回到 A 会话中继续做查询操作,如下:

Mysql 中 S 锁和 X 锁的区别

可以看到,A 会话中第一个查询是快照读,读取到的是当前事务开启时的数据状态,后面两个查询则是当前读,读取到了当前最新的数据(B 会话中修改后的数据)。

4. 小结

好啦,一个小小的知识点,日积月累,fighting!

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

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

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

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