行级别的锁
1、共享锁:也称为读锁,多个读锁是共享一把锁,只能读数据,如果去修改数据可能会造成死锁;
2、排他锁:也称为写锁,不能与共享锁或者排他锁并行 (新增、修改、删除语句会自动加上排他锁)手动加锁:select * from demo where id =1 for
表级别的锁
意向锁的作用:提高加锁的效率,比如当一行数据被加排他锁,会相对应开启意向排他锁锁住整张表,当别的事物再去尝试锁表,就无须扫描整个表是否有排他锁了
3、意向共享锁:在事物准备给数据加共享锁之前,数据引擎会先给该表加意向共享锁
4、意向排他锁:在事物准备给数据加排他锁之前,数据引擎会先给该表加意向排他锁
5、临键锁 当使用范围查询的时候会使用 区间 负无穷大-1;1-4;4-7;7-10;10-无穷大
select * from demo where id>5 and id<9 for update 锁住范围(4,10]
6、间隙锁 主要解决幻读(Gap)记录不存在,就退化成间隙锁,只在可重复读事物隔离级别存在
比如锁住id=6 那就是锁住4-7这个区间
7、记录锁 唯一索引精准匹配 退化成记录锁
只能锁住id=xx
特性:锁之间不冲突
事物一:select * from demo where id=6 for update
事物二:select * from demo where id=6 for update 也是能成功
问题:
1、InnoDB锁锁定的是什么
答:InnoDB锁锁定的是索引
2、如果表表上面没有索引或者查询没有命中索引,会锁住整张表?
答:因为一张表一定会有主键索引,如果没有设置主键,默认会有隐藏的聚集索引,导致全表扫描,产生锁住整表的现象