锁
锁的分类
锁的粒度
- 全局锁
- 场景:做全库逻辑备份
- 表级锁
- 表锁
- 元数据锁
- 在访问某张表(增删改查),的时候会加上元数据读锁
- 注意事项:
- 当要修改结构的表是热点表的时候,如果此时查询频率很高,会导致服务阻塞
- 如何避免:在alter table语句里面设定等待时间
- 待验证:如何长事务select一直占着读锁mdl读锁,这时候进行ddl会阻塞, 那么下一个select会阻塞吗
- 当要修改结构的表是热点表的时候,如果此时查询频率很高,会导致服务阻塞
- 行级锁
- 需要提交事务的时候才会释放所有持有的行锁
- 注意事项:
- 要把耗时长的,有可能造成锁冲突的放在事务的后面(共享度最高的那个操作)
- 避免死锁
- 设置等待锁的超时时间
- 启动死锁检查
- 控制并发度
锁的排他性
读锁和读锁互不阻塞,有读锁的情况下不能加写锁,有写锁的情况下不能加读锁。已经持有读锁的情况下可以升级成写锁。
- 写锁(Write Lock,也叫作排他锁,eXclusive Lock,简写为 X-Lock):
- 读锁(Read Lock,也叫作共享锁,Shared Lock,简写为 S-Lock):
锁的具体类型
- 间隙锁
- 临键锁
- 范围锁
- 意向锁