1.MyISAM与InnoDB关于锁方面的区别是什么
-
InnoDB
- 默认使用的是行级锁,也支持表级锁
- 涉及有索引的sql语句使用行级锁,没有走索引的sql语句直接使用的时表锁
-
MyISAM
- 默认用的是表级锁,不支持行级锁
- 1.表级锁会锁住整张表
2.锁类型
-
共享锁:
- 用于不更改或者不更新数据只读的操作,如select语句,例如事务T对数据A加上共享锁后,其他事务只能对A再加上共享锁,只能读数据,不能修改数据
- 对于select 语句InnoDB一般情况下是不会加共享锁,(正常情况能查询就代表没有排他锁,如果存在的话 等待就是了),如果需要测试,可以关闭autocommit 自动提交,然后开启两个会话进行测试
- 显示添加共享锁:SELECT … LOCK IN SHARE MODE;
-
排他锁:
- 用于修改数据的操作,如Insert/Update/Delete 确保不会同时对同一资源进行更新
- 对于Inser/Update/Delete InnoDB会自动给涉及的数据加上排他锁
- 显示添加排他锁:SELECT … FOR UPDATE;
-
乐观锁:
-
想法很乐观,认为这次的数据操作不会造成数据冲突,在处理数据前不对数据进行加锁,而是在更新时,判断
-
示例
-
-
间隙锁
-
当我们用范围条件条件检索数据(非聚簇索引、非唯一索引),并请求共享或排他锁时,InnoDB会给符合条件的数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,称为间隙,InnoDB也会为这些间隙加锁,即间隙锁。
-
需要满足的三个条件
- 1.隔离级别未RR
- 2.当前读
- 3.查询条件能够走到索引
-
作用
- 间隙锁的目的是为了让其他事务无法在间隙中新增数据。
- 防止在间隙中执行insert语句
- 防止将已有数据update到间隙中
-
-
意向锁
- 数据库自身行为,不需要人工干预,在事务结束的时候会自行解除
- 意向锁的主要作用是提升存储引擎性能,innoDB中的S锁和X锁是行锁,每当事务到来时,存储引擎需要遍历所有行的锁持有情况,性能较低,因此引入意向锁,检查行锁前先检查意向锁是否存在,如果存在则阻塞线程。
-
相关地址:
- https://blog.csdn.net/weixin_45395031/article/details/108803340
- https://www.cnblogs.com/zhaoshaopeng/p/13527651.html