mysql 锁_mysql共享锁及排它锁

目录

  • 概述
  • 共享锁
  • 排他锁
  • 共享锁与排他锁小结
  • php7进阶到架构师相关阅读

概述

这是关于php进阶到架构之Mysql进阶学习的第篇文章:mysql共享锁及排它锁

  • 第一篇:mysql共享锁及排它锁

mysql锁机制分为表级锁和行级锁

共享锁

又称为读锁,简称S锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改加共享锁可以使用select ... lock in share mode语句

我们有如下测试数据:

a74b62de947a53e23115f7cfdc05a0cc.png

现在我们对id=1的数据行共享锁查询,这里会使用begin开启事务,而不关闭事务,这样做是用来测试,因为提交事务或回滚事务就会释放锁

共享锁sql分析实例

打开一个查询窗口

601f2731137d51670167696b31b73269.png
BEGIN;SELECT * FROM area WHERE id=1 LOCK IN SHARE MODE

查询结果如下:

4e0e772b41f76c53b2ad9adcdf60a20b.png

此时我们没有提交事务,共享锁没有被释放。

实例1:

这时候我们新开一窗口,对id=1的数据行修改下数据试试

UPDATE area SET area_name='北京市2' WHERE id=1

运行结果如下:

9b14bde2c151f4fc5af537018f90cb85.png

一直在运行中。

原因是共享锁没有被释放

实例2:

这时我们再新开一个窗口,对id=1的数据行读取(不加锁机制)试试

9afbbb0da3865298435c65a70d0a9c35.png

可以读取数据

实例3:

这时我们再新开一个窗口,对id=1的数据行读取(加读锁机制)试试

1730cc90ff01f0c5b76793e873e8ae0c.png

也可以读取数据

由此得出以下结论:

1.共享锁的行不可以被修改(实例1)

2.共享锁的行可以不加任何锁读取(实例2)

3.共享锁的行可以加读锁读取(实例3)

排他锁

mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁

select语句默认不会加任何锁类型,

如果加排他锁可以使用select ...for update

加过排他锁的数据行在其他事务中是不能修改数据的,

也不能通过for update和lock in share mode锁的方式查询数据,

但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制

排他锁sql分析实例

打开一个窗口,现在我们对id=1的数据行排他查询

c2e3d5bac1230f4c49df76b2111b4da3.png

此时我们没有提交事务,排他锁没有被释放

实例4:

新开一个窗口,对id=1的数据行排他锁方式读取试试

7af4749ff91308303bedf325cc96c897.png

一直在运行中。原因是排他锁没有被释放

实例5:

再新开一个窗口,对id=1的数据行共享锁方式读取试试

c276946cfdb61fa9ecf8e6b5baba5f7d.png

一直在运行中。原因是排他锁没有被释放

实例6:

再新开一个窗口,对id=1的数据行进行普通查询试试

b0414ed7325ddc9a8a7233af930bfea1.png

可以读取到数据

由此得出以下结论:

1.排他锁的行不可以再加排他锁(实例4)

2.排他锁的行可以不加读锁(实例5)

1,2两点简化之排他锁的行不可以再加任何锁

3.排他锁的行可以普通读取(实例6)

共享锁与排他锁小结

排他锁与共享锁不能存在同一数据上

排他锁与排他锁也不能在同一数据上

共享锁与共享锁可以在同一数据上。

不用锁的查询可以读取加锁(共享锁,排他锁)的同一行数据

php7进阶到架构师相关阅读

https://www.kancloud.cn/gofor/gofor

最后,欢迎大家留言补充,讨论~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值