mysql锁的分类

1.锁分类

从对数据操作的粒度分为:行锁和表锁
从对数据操作的类型分为:读锁(共享锁)和写锁(排它锁)
1.读锁:针对同一份数据,多个读操作可以同时进行而不会互相影响
2.写锁:当前操作没有完成之前,它会阻断其他写锁和读锁

2

MyISAM支持表锁,InnoDB支持表锁和行锁

3.MyIsam的表锁情况(读锁和写锁)

在这里插入图片描述
假设有两个客户端。当其中的一个客户端A对某个数据库中的某个表加了读锁之后,1.两个客户端都可以读取数据,2.A在没有释放锁之前,不能够读取其他表中数据,B客户端可以读取其他表的数据。3.A客户端不能修改其他表的数据,B客户端执行修改语句会阻塞,直到A客户端释放锁(unlock tables)。

假设有两个客户端。当其中的一个客户端A对某个数据库中的某个表加了写锁之后,1.A客户端可以读取数据,可以修改和增加数据。B客户端执行读取、修改、增加语句都会阻塞。

简而言之,读锁会阻塞写,但是不会阻塞读。写锁既会阻塞读,也会阻塞写。

MYISAM不适合做写为主的表的存储引擎,因为写锁后,其他的线程不能够做任何的操作,大量的更新会使查询很难得到锁。从而造成永远的阻塞。

4.锁的争用情况

1.show open tables
在这里插入图片描述
2.show staus like ‘table_locks%’
在这里插入图片描述

5.InnoDB行锁

特点:开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度也是最高。支持事务,采用了行级锁。

6.InnoDB行锁情况(读锁和写锁)

对于select语句,InnoDB不会加任何锁
对于update、delete、insert语句,InnoDB会自动给涉及到的数据行加排它锁
在这里插入图片描述
假设有两个客户端。当其中的一个客户端A对数据库中的某张表的某一行加了写锁,1.A可以修改数据,B修改数据会阻塞,等到A执行commit之后,才可以修改数据

如果不通过索引条件检索数据,或者索引失效,InnoDB行锁会升级为表锁

7.间隙锁

当我们使用范围条件,而不是使用相等条件检索数据,并请求共享锁或排它锁时,InnoDB会给符合条件得已有数据进行加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙”,InnoDB也会对这个“间隙”加锁。

可以缩小范围来尽量避免间隙锁

8.InnoDB行锁争用情况

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值