美文网首页
innodb行锁:两阶段锁协议与死锁预防

innodb行锁:两阶段锁协议与死锁预防

作者: cbhe | 来源:发表于2020-05-19 21:52 被阅读0次

先放个网络美女提提神

MySQL的行级锁是由各个引擎自己实现的,innodb支持行级锁但MyISAM却不支持,这也是innodb更受青睐的原因之一。
想要高效使用innodb的行级锁,必须要熟悉两阶段锁协议和死锁预防。

两阶段锁协议

  • 定义
    事务执行时,在运行到需要加锁的语句时加锁,但不是对应语句执行完了就释放锁,而是等到commit时才会释放锁。


    图1 两阶段锁协议实例

    如图1所示,session1在t1时刻对id=1的行加锁了。在t4时刻session2想要更新id=1的行,这是会被阻塞,因为id=1的行锁需要等到t5时刻session1 commit后才会被释放。
    对程序的影响
    在编写程序时,程序员应当尽量将需要请求行锁的代码放到离commit更近的地方。

死锁预防措施

  • 我们知道死锁发生的条件

    1. 多个资源互斥访问
    2. 资源被获取后不可抢占
    3. 多个线程循环等待
  • 在数据库行级锁场景下,这些条件都会被满足,因此对于行级锁的请求肯定会造成死锁。那我们应当如何解决死锁呢,有如下两种办法:

    1. 死锁检测
      著名的死锁检测方法就是银行家算法,不知道的小伙伴可以查一下。但这有个非常大的缺点,每次死锁检测的时间复杂度为O(N),因此如果有1000个线程要执行加锁操作时就会带来100万级别的时间复杂度开销。

    2. 控制并发度
      很好理解,线程数越少死锁发生的概率越小。可以通过控制统一时刻访问同一行的请求数量来控制并发度以减少死锁发生的概率。另一种方式就是将数据分散,比如数据库中原来有一行数据记录用户在银行的存款数额,现在将其拆分成10行,10行数额的相加就是这个用户的存款数,当一个请求要修改该用户的存款数额的时候,就随机从10行中选一行进行操作,这样就将并发度减少为了1/10。

相关文章

  • innodb行锁:两阶段锁协议与死锁预防

    先放个网络美女提提神 MySQL的行级锁是由各个引擎自己实现的,innodb支持行级锁但MyISAM却不支持,这也...

  • Mysql学习(六) 行锁

    行锁、死锁、死锁监测 两阶段协议锁,如何安排正确的事务语句,可能影响并发度的锁尽量往后放 死锁和死锁监测,如何减少...

  • 15.mysql锁问题(2)-InnoDB

    5. InnoDB 行锁 5.1 行锁介绍 行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁...

  • mysql行锁和表锁

    InnoDB支持行级锁(row-levellocking)和表级锁,默认为行级锁 MyISAM中是不会产生死锁的,...

  • MySQL技术内幕InnoDB存储引擎阅读相关笔记-锁

    一、InnoDB锁 对于MyISAM引擎来说,其锁是表锁。InnoDB引擎提供行锁。 1、InnoDB行锁 1)、...

  • 阿里P8大佬带你全面了解—MySQL锁:03.InnoDB行锁

    目录 InnoDB 行锁锁排查可以用的视图和数据字典InnoDB 行锁兼容性 InnoDB行锁之共享锁共享锁: 查...

  • InnoDB锁与死锁

    InnoDB 有哪些锁?其表现和意义是什么?增删改查分别加什么锁?死锁是怎么产生的?怎么分析和避免?本文对这些问题...

  • MySQL-InnoDB行锁

    InnoDB的锁类型 InnoDB存储引擎支持行锁,锁类型有两种: 共享锁(S锁) 排他锁(X锁) S和S不互斥,...

  • 数据库基础

    1 锁 1.1 InnoDB的锁 行级锁(InnoDB存储引擎实现了两种标准的)共享锁 允许事务读一行数据排他锁 ...

  • 校招面试题mysql锁总结

    目录 锁定义 锁分类 读锁和写锁 表锁和行锁 InnoDB共享锁和排他锁 InnoDB意向锁和排他锁 InnoDB...

网友评论

      本文标题:innodb行锁:两阶段锁协议与死锁预防

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