-
mysql中有哪几种锁?
答:全局锁、表级锁、行锁、间隙锁、next-key lock(间隙锁和行锁) -
全局锁的使用场景有哪些?
答:做全库的逻辑备份 -
启用全局锁的方式有哪些?
答:flush tables with read lock(FTWRL)执行这个命令会使整个库处于只读状态
mysqldump逻辑备份工具,当使用-signle-transaction参数的时候,导数据之前会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据时可以正常更新的
set global readonly=true,全库只读 -
表级锁有哪几种?
答:有两种,一种是表锁,一种是元数据锁(metadata lock,MDL) -
启用表锁的方式是什么?
答:lock tables … read/write,会限制本线程和其他线程的操作 -
元数据锁是什么,作用是什么?
答:MDL的作用是保证读写的正确性。当对一个表做增删改查的时候,加MDL读锁,当要对表做结构变更操作的时候,加MDL写锁,读锁之间不互斥,读写锁、写锁之间是互斥的。 -
加字段可能出现的问题?
答:如果某个热点表一直会有查询进来,那么我们在修改字段的时候会加上MDL写锁,当MDL写锁执行过程中,查询语句会一直等待,如果查询语句比较频繁,而且客户端有重试机制,这个库的线程很快就会被爆满。 -
如何安全的给小表加字段?
答:在alter table语句里面设置等待时间,如果在指定的等待时间中拿到MDL写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后开发人员或者DBA再通过重试命令重复这个过程。 -
MylSAM支持行锁吗?
答:不支持,只支持表锁。 -
行锁是什么?
答:行锁就是针对数据表中行记录的锁,比如事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才可以进行更新。 -
两阶段锁协议是什么?
答:在InnoDB事务中,行锁是在需要的时候才加上,但并不是不需要了就立刻释放,而是要等到事务结束时才释放,这就是两阶段锁协议,分为加锁阶段和解锁阶段,所有的lock操作都在unlock操作之后。 -
了解到两阶段锁协议后,对我们使用事务又什么帮助?
答:如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。 -
死锁是什么?
答:当并发系统中不同线程出现循环资源依赖,涉及到的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁 -
解决死锁的方案有哪些?
答:
1. 直接进入等待,直到超时。这个超时时间可以通过参innodb_lock_wait_timeout来设置
2. 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数innodb_deadlock_detect设置为on,表示开启这个逻辑。 -
查询一行的语句,也执行慢有哪些原因?
答:- 表被锁了, 解决方案:首先执行一下show processlist命令,看看当前语句处于什么状态,然后在针对每一种状态,去分析它们产生的原因,如何复现以及如何处理
- 等MDL(元数据)锁,解决方案:使用show processlist命令查看waiting for table metadata lock是否有这个状态存在,这个状态表示的是,现在有一个线程正在对表t上请求或者持有MDL写锁,把select语句给堵住了。接下来就是找到谁持有MDL写锁,然后把它kill掉
- 等flush,解决方案:一般flush执行都很快,主要是其他语句执行堵住了flush这个语句,导致了后面查询被堵住。解决方案是 show processlist查询到有问题的语句,然后kill掉。
- 等行锁,解决方案:如果是select语句后面加了 lock in share mode或者 for update的话就是当前读,当前读读时候,如果前面有事务没有提交,就会一直被堵住
- 没有走索引, 解决方案:相关查询字段加上索引
-
mysql加锁规则?
答:加锁规则里面主要包含了两个“原则”、两个“优化”和一个“bug”- 原则1:加锁的基本单位是next-key lock。希望你还记得,next-key lock是前开后闭区间。
- 原则2:查找过程中访问的对象才会加锁
- 优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁
- 优化2:索引上的等值查询,像右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁
- 一个bug:唯一索引上的范围查询会访问到不满足第一个值为止。
mysql 锁相关问题整理
最新推荐文章于 2022-07-02 13:56:19 发布