mysql 锁相关问题整理

  1. mysql中有哪几种锁?
    答:全局锁、表级锁、行锁、间隙锁、next-key lock(间隙锁和行锁)

  2. 全局锁的使用场景有哪些?
    答:做全库的逻辑备份

  3. 启用全局锁的方式有哪些?
    答:flush tables with read lock(FTWRL)执行这个命令会使整个库处于只读状态
    mysqldump逻辑备份工具,当使用-signle-transaction参数的时候,导数据之前会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据时可以正常更新的
    set global readonly=true,全库只读

  4. 表级锁有哪几种?
    答:有两种,一种是表锁,一种是元数据锁(metadata lock,MDL)

  5. 启用表锁的方式是什么?
    答:lock tables … read/write,会限制本线程和其他线程的操作

  6. 元数据锁是什么,作用是什么?
    答:MDL的作用是保证读写的正确性。当对一个表做增删改查的时候,加MDL读锁,当要对表做结构变更操作的时候,加MDL写锁,读锁之间不互斥,读写锁、写锁之间是互斥的。

  7. 加字段可能出现的问题?
    答:如果某个热点表一直会有查询进来,那么我们在修改字段的时候会加上MDL写锁,当MDL写锁执行过程中,查询语句会一直等待,如果查询语句比较频繁,而且客户端有重试机制,这个库的线程很快就会被爆满。

  8. 如何安全的给小表加字段?
    答:在alter table语句里面设置等待时间,如果在指定的等待时间中拿到MDL写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后开发人员或者DBA再通过重试命令重复这个过程。

  9. MylSAM支持行锁吗?
    答:不支持,只支持表锁。

  10. 行锁是什么?
    答:行锁就是针对数据表中行记录的锁,比如事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才可以进行更新。

  11. 两阶段锁协议是什么?
    答:在InnoDB事务中,行锁是在需要的时候才加上,但并不是不需要了就立刻释放,而是要等到事务结束时才释放,这就是两阶段锁协议,分为加锁阶段和解锁阶段,所有的lock操作都在unlock操作之后。

  12. 了解到两阶段锁协议后,对我们使用事务又什么帮助?
    答:如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。

  13. 死锁是什么?
    答:当并发系统中不同线程出现循环资源依赖,涉及到的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁

  14. 解决死锁的方案有哪些?
    答:
    1. 直接进入等待,直到超时。这个超时时间可以通过参innodb_lock_wait_timeout来设置
    2. 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数innodb_deadlock_detect设置为on,表示开启这个逻辑。

  15. 查询一行的语句,也执行慢有哪些原因?
    答:

    1. 表被锁了, 解决方案:首先执行一下show processlist命令,看看当前语句处于什么状态,然后在针对每一种状态,去分析它们产生的原因,如何复现以及如何处理
    2. 等MDL(元数据)锁,解决方案:使用show processlist命令查看waiting for table metadata lock是否有这个状态存在,这个状态表示的是,现在有一个线程正在对表t上请求或者持有MDL写锁,把select语句给堵住了。接下来就是找到谁持有MDL写锁,然后把它kill掉
    3. 等flush,解决方案:一般flush执行都很快,主要是其他语句执行堵住了flush这个语句,导致了后面查询被堵住。解决方案是 show processlist查询到有问题的语句,然后kill掉。
    4. 等行锁,解决方案:如果是select语句后面加了 lock in share mode或者 for update的话就是当前读,当前读读时候,如果前面有事务没有提交,就会一直被堵住
    5. 没有走索引, 解决方案:相关查询字段加上索引
  16. mysql加锁规则?
    答:加锁规则里面主要包含了两个“原则”、两个“优化”和一个“bug”

    1. 原则1:加锁的基本单位是next-key lock。希望你还记得,next-key lock是前开后闭区间。
    2. 原则2:查找过程中访问的对象才会加锁
    3. 优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁
    4. 优化2:索引上的等值查询,像右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁
    5. 一个bug:唯一索引上的范围查询会访问到不满足第一个值为止。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值