Mysql中的锁

1.为什么需要加锁
为了保证数据的一致性

2.Mysql中存在什么锁
表锁和行锁
表锁与行锁粒度的对比:
锁定粒度: 表锁 > 行锁
加锁效率: 表锁 > 行锁
冲突概率: 表锁 > 行锁
并发性能: 表锁 < 行锁

3.针对锁,又可细分为以下几种锁
3.1:表锁
表锁的优势:开销小;加锁快;无死锁
表锁的劣势:锁粒度大,发生锁冲突的概率高,并发处理能力低
加锁的方式:自动加锁。查询操作(SELECT),会自动给涉及的所有表加读锁,更新操作(UPDATE、DELETE、INSERT),会自动给涉及的表加写锁。也可以显示加锁:
注意:

共享读锁:lock table tableName read;
独占写锁:lock table tableName write;
批量解锁:unlock tables;

3.2:行锁
行锁的劣势:开销大;加锁慢;会出现死锁
行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力强
加锁的方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁;当然我们也可以显示的加锁:
注意:如果where条件是索引的话,则是表锁。
有人说:如果where条件不是主键或者唯一索引的话,则行锁升级表锁,但是经过我本人验证,发现 普通索引 或者不是索引的条件,并不会升级为行锁。
原因:当 “普通索引”的重复低时,接近主键或者唯一索引时,则不会产生表锁。
相反 当“重复率高”时 mysql并不会把它当作是一个索引。故而将行锁升级为表锁

共享锁:select * from tableName where … + lock in share more
排他锁:select * from tableName where … + for update

InnoDB和MyISAM的最大不同点有两个:一,InnoDB支持事务(transaction);二,默认采用行级锁。加锁可以保证事务的一致性,可谓是有人(锁)的地方,就有江湖(事务);我们先简单了解一下事务知识。

a.共享锁(Shared Lock):简称 “ 读 ”锁,就是多个事务对于同一锁可以共享一把锁,都能访问到数据吗,但是只能读不能写。否则会发生死锁
加锁方式:select * from student where id = 1 LOCK IN SHARE MODE;

b.排它锁():又称为 “ 写 ”锁。 顾名思义。排它,排它 就是不能与其它锁共存。如果一个事务获取了一个数据行的排它锁,那么其它事务就不能再获取该行的值(其它锁:共享锁,排它锁:如果不是事务的是可以读取这条数据的)。只有当前锁的事务才可以对数据进行读取 和修改。
加锁方式:select * from student where id = 1 for update

另外。因为当一个事务对一个数据行进行操作时,需要判断改行(表) 是否有锁,如果数据量大,那么就会逐一排查。导致效率降低,故又增加了 意向共享锁意向排它锁

c.意向共享锁: 标识事务准备给数据加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的 意向共享锁。
当数据已经加了锁之后,那么就会添加一个标识 就是意向共享锁。

d.意向排它锁:标识事务准备给数据加入排它锁,也就是说一个数据行加排它锁前必须先取得该表的 意向排它锁。

e:乐观锁
当操作数据时,总是认为其它人不会修改操作的数据,而是在最后更新的时候判断该数据是否被其它人操作过。常用方式为: 添加 版本号 version字段 或者 CAS算法。
常用于:读

f:悲观锁
当操作数据时,总是认为其它人会修改它的数据,所以会加上一把锁,其它人会阻塞,当自己释放之后其它 人才可以操作该条数据。可以理解为 排他锁,表锁,行锁。另外 synchronized 就是悲观锁思想
常用于:数据经常写操作。

4.锁的范围
间隙锁: 意思就是 当我们的查询条件不是相等条件时,而是 大于 小于这种,那么就会加上一个间隙锁。锁的是一个区间

ex: 表中student 有id为1,2,3,6,10 的数据
当我使用 select id from student where id >3 and id <6; 时 那么锁的就是id范围为 3~6 里面的数据

备注:
Mysql查询当前锁表:

show OPEN TABLES where In_use > 0;

参考:https://www.cnblogs.com/zyy1688/p/9983122.html 普通索引升级为表锁https://blog.csdn.net/xts5701046/article/details/81395958 Mysql表锁和行锁机制
https://blog.csdn.net/qq_34337272/article/details/81072874 面试必备之乐观锁与悲观锁
https://blog.csdn.net/yanghan1222/article/details/80449528 MySql悲观锁和乐观锁的使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值