美文网首页
mysql实战(七)行锁、死锁

mysql实战(七)行锁、死锁

作者: WAHAHA402 | 来源:发表于2020-12-14 19:23 被阅读0次

    MySQL的行锁是在引擎层实现的,MySQL原生引擎MyISAM不具备行锁,这也是被InnoDB替换它的原因。

    两阶段锁协议:
    InnoDB事务中,行锁是需要时才被加上的,该行锁在事务结束时才会被释放。

    根据两阶段锁协议,可以联想到:如果一个事务需要锁多个行,要把最可能造成锁冲突、影响并发度的锁往后放(即:把可能导致行锁冲突的sql语句update语句等,放在一个事务的最后执行)。

    死锁和死锁检测
    并发系统中不同线程出现循环资源依赖,互相等待对方释放资源却不得,而陷入无限等待的状态,称为死锁。

    死锁解决策略

    1、进入等待,直到超时。超时时间可以通过参数innodb_lock_wait_timeout来设置。
    缺点:设置太长,会导致很久才退出,服务停摆;设置太短,容易将执行时间较长的正常事务“误伤”。

    2、主动检测死锁
    更加常用。参数innodb_deadlock_detect设置,默认为on。
    缺点:很多线程同时更新热点行时,每个线程需要遍历其他线程占有的资源,时间复杂度为O(n平方)。
    解决方法: 1)确保不会出现死锁是,关闭该参数为off 2)控制并发度(例如通过业务设计优化等方式)。

    相关文章

      网友评论

          本文标题:mysql实战(七)行锁、死锁

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