Mysql锁机制

902 阅读3分钟
  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. 尽可能使用等式而不是范围性的查询。

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