美文网首页
【重学MySQL打卡行动】Day5 MySQL的全局锁、表锁、行

【重学MySQL打卡行动】Day5 MySQL的全局锁、表锁、行

作者: 花生无翼 | 来源:发表于2020-07-07 22:36 被阅读0次

    学习内容:根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。

    1.全局锁就是对整个数据库实例加锁,典型使用场景是做全库逻辑备份。
    全局锁的典型使用场景是,做全库逻辑备份

    官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务。

    对于全部是 InnoDB 引擎的库,建议使用–single-transaction 参数。

    single-transaction 方法只适用于所有的表使用事务引擎的库。

    2.表级锁包括表锁和MDL锁两种。表锁一般是在数据库引擎不支持行锁的时候才会被用到的。
    表锁的语法是 lock tables … read/write。

    3.行锁就是针对数据表中行记录的锁,但并不是所有的引擎(MyISAM)都支持行锁。

    两阶段协议:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。

    如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。

    死锁和死锁检测
    死锁:当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态。

    解决死锁的两种策略:
    1.直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。
    2.发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。
    正常情况下我们还是要采用第二种策略,即:主动死锁检测

    怎么解决由这种热点行更新导致的性能问题呢?
    一种头痛医头的方法,就是如果你能确保这个业务一定不会出现死锁,可以临时把死锁检测关掉。
    另一个思路是控制并发度。

    相关文章

      网友评论

          本文标题:【重学MySQL打卡行动】Day5 MySQL的全局锁、表锁、行

          本文链接:https://www.haomeiwen.com/subject/wdetcktx.html