Mysql锁机制

  1. mysql锁基础

锁等待现象
表级锁:锁住一张表的数据 =》 myisam ,innodb
页级锁:是锁一页的数据
行级锁:锁住一行的数据 =》 innodb

排它锁:select * from user where id =1 for update;–for update表示对要检查的语句加排它锁
共享锁:select * from user where id =1 lock in share mode;lock in share mode表示对要检查的语句加排它锁
加共享锁

autocommit = 0;–事务自动提交 1为自动提交 0是取消自动提交

  1. 排它锁与共享锁

排它锁:排它锁与排它锁不能一起使用,排它锁与共享锁不能一起使用
共享锁:共享锁与共享锁可以一起使用
普通查询不会受到加锁的影响,他依然可以获取加锁后的数据
对于update ,insert ,alter等写操作,mysql在事务中会自动加上一把排它锁
select * from user where id =1;
begin / 默认会自带事务的开启以及提交
update user set username = ‘111’ where id =1;
commit

当前读取:一般只的是加锁的select
快照读取:一般只的是没加锁的普通查询

事务1 加锁 select * from product where id = 1 for update;
事务2
select * from product where id = 1 for update;

使用我们的业务强制进入串行化

  1. 乐观锁于悲观锁的解释

悲观锁:悲观 悲观锁不管是加什么锁,只要是上了锁都属于悲观锁
乐观锁:乐观 比如说MVCC
select * from product where id = 1

mvcc – 多版本并发控制
主键 用户名 年龄 数据的版本号 数据第一次新增 version默认 1
id username age version
1 name 1 1

select * from user where id =1;
update user set username = ‘111’,version = version+1 where id =1;

乐观锁解决超卖问题

  1. 死锁的产生于处理

  2. 间隙锁与行锁升级为表锁

事务1 事务2

update product set product_stock = product_stock-1,version = version+1 where id =2 and version=1;
commit;

以下哪些不是MySQL的锁机制?
排它锁
共享锁
表级锁
页级锁
行级锁
悲观锁
乐观锁

死锁 =》 属于一个现象

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
还有一种可能不会直接报错,而是事务1在等待事务2 ,事务2在等待事务1,
锁等待的时间 wait_timeout=120 –设置的是锁等待的时间
锁等待时间结束之后会有一个失败和一个成功
mysql的选择与事务的大小有关 select 舍小保大
模糊查询的查询 范围的查询

说明事务与事务之间产生了死锁

间隙锁:当我们使用的范围查询而不是等式查询,并请求或者排他锁的时候
危害:如果在查询中通过范围去查询,锁锁住的范围会是所有索引的键值。即使这个数据不存在

行锁升级为表锁
id =1
锁去锁住数据 =》 是与索引有一定的联系
主键与唯一索引 几乎为0
普通索引:很大几率会数据会出现重复
age = 10

在不加索引的字段(除主键以及唯一索引之外)上进行数据的加锁,会升级为表锁
在加了索引之后加锁会根据普通索引的基础上去进行加锁
而一旦索引失效,有会升级会表锁。

  1. 会尽可能是索引字段进行加锁
  2. 尽可能使用等式而不是范围性的查询。

不只是排它锁,共享锁也是一样的道理

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享