MySQL中的锁
Posted danaohu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中的锁相关的知识,希望对你有一定的参考价值。
宏观
数据库锁
- 粒度小,方便用于集群环境
代码锁
- 粒度略大,需要封装
微观(数据库锁)
分类
行锁&表锁
只有明确指定主键,才会执行行锁,否则执行表锁
-
无锁
select * from user where id = -1 for update; #主键不存在
-
行锁
select * from user where id = 1 for update; select * from user where id = 1 and name = \'kk\' for update;
-
表锁
#主键不明确 select * from user where name = \'kk\' for update; select * from use where id <>3 for update;
锁算法(机制)
行锁算法
-
Record Lock(普通行锁)
#主键值在条件范围内 #记录存在
-
Gap Lock(间隙锁)
#主键值不存在条件范围内,叫做间隙GAP,引擎就会对这个间隙加锁
-
Next-key Lock(行& 间隙锁)
#主键值一部分在条件范围内 #比如user表id字段自增共50条数据 select * from user where id >49;
表锁算法
-
意向锁(升级机制)
#当一个事务,带着表锁去访问被加了行锁的资源,此时,这个行锁就会升级为意向锁,将表锁住。 #Session A select * from user where id = 1 for update ; #Session B select * from user where name like \'kkk%\' for update; 那么Session A 就会升级成意向锁
-
自增锁
#事务插入自增类型的列时,获取自增锁。 #如果一个事务正在往表中插入自增记录,其他事务都必须等待。
实现
共享锁 & 排他锁
行锁和表锁是粒度的概念,共享锁和排他锁是他们的具体实现。
共享锁(S)
允许一个事务去读一行,阻止其他事务去获取该行的排他锁。
select lock in share mode
排他锁(X):写锁
允许持有排它锁事务读写数据,阻止其他事务获取该资源的共享锁和排它锁
select for update\\insert\\delete
多并发版本控制MVCC
加锁是当前读,保证读取的是最新的数据;在隔离级别为REPEATABLE时,不加锁的select操作是快照读,有可能读到的不是最新的版本。ps:在串行级别下,快照读会退化成当前读。
以上是关于MySQL中的锁的主要内容,如果未能解决你的问题,请参考以下文章