蝴蝶兰风评网CTRL+D收藏本站 您好!欢迎来到蝴蝶兰风评

当前位置: 首页 > 装修知识 > 正文

锁的种类|mysql中的锁详解

2022-10-08 06:57:20

一 锁分类

从性能上分为乐观锁(用版本对比来实现)和悲观锁

从对数据库操作的类型分,分为读锁和写锁(都属于悲观锁)

读锁(共享锁,S锁()):针对同一份数据,多个读操作可以同时进行而不会互相影响

写锁(排它锁,X锁()):当前写操作没有完成前,它会阻断其他写锁和读锁

从对数据操作的粒度分锁的种类,分为表锁和行锁

二 表锁

每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般

用在整表数据迁移的场景。

--手动增加表锁 
lock table 表名称 read(write),表名称2 read(write); 
--查看表上加过的锁 
show open tables; 
--删除表锁 
unlock tables;

三 行锁

每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

注意:锁主要是加在索引上,如果对非索引字段更新,行锁可能会变表锁 ,的行锁是针对索引加的锁,不

是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为 。

四 间隙锁(Gap Lock)

间隙锁锁的种类,锁的就是两个值的间隙,间隙锁和间隙锁不互斥,法在这个范围所包含的所有行记录(包括间隙行记录)以及行记录所在的间隙里插入或修改任何数据,而且是在可重复读的隔离级别下,举个例子

user 表中
id       name   
1        zhangsan 
2        lisi

a級锁与b级锁c级锁图_锁的种类_java 对象锁 方法锁 类锁

3 wangwu 10 zhaoliu 20 sunqi --sql 语句 update user set name='666' where id >5 and id (3,10) (10,20) (20,+∞) id >5 落在了 (3,10) 这个间隙中 id<19 落在了 (10,20) 这个间隙中 对这两个间隙进行加锁 下面这个语句就会被阻塞住 insert user into (id,name) values(6,xiaoming),落在了间隙(3,10)中

五 临键锁(Next-key Locks)

Next-Key Locks是行锁与间隙锁的组合。像上面那个例子里的这个(3,20]的整个区间可以叫做临键锁。

六 锁优化建议

记住一句话:锁在用的时候就会加上,也就是mysql会自动加上,但是用完之后不会自动解锁,直到事务结束的时候才会解锁

尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁

合理设计索引,尽量缩小锁的范围

尽可能减少检索条件范围,避免间隙锁

尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行

尽可能低级别事务隔离

以上内容为蝴蝶兰风评投稿者为大家精心整理,希望对大家有所帮助!

留言与评论(共有 条评论)
   
验证码: 匿名发表
搜索
标签列表