美文网首页
mysql死锁的产生和解决

mysql死锁的产生和解决

作者: 虾餃 | 来源:发表于2020-04-18 16:35 被阅读0次

笔者所有文章第一时间发布于:
hhbbz的个人博客

产生死锁的四个必要条件:

  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
下列方法有助于最大限度地降低死锁:

  1. 按同一顺序访问对象。
  2. 避免事务中的用户交互。
  3. 保持事务简短并在一个批处理中。
  4. 使用低隔离级别。
  5. 使用绑定连接。

数据库常见死锁原因及处理

  1. 事务之间对资源访问顺序的交替

出现原因:
一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

解决方法:
这种死锁比较常见,是由于程序的BUG产生的

  1. 并发修改同一记录

出现原因:
用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。这种死锁由于比较隐蔽,但在稍大点的项目中经常发生。

解决方法:

  1. 使用乐观锁进行控制。(cas:预期值,内存值,新值)
  2. 使用悲观锁进行控制。(mysql:setAutoCommit=0,select...for update)

相关文章

  • mysql死锁的产生和解决

    笔者所有文章第一时间发布于:hhbbz的个人博客 产生死锁的四个必要条件: 互斥条件:一个资源每次只能被一个进程使...

  • 数据库_锁

    六、数据库锁1.mysql都有什么锁,死锁判定原理和具体场景,死锁怎么解决?MySQL有三种锁的级别:页级、表级、...

  • mysql死锁解决

    查询 造成死锁的进程id (trx_mysql_thread_id)SELECT * FROM informati...

  • MySQL死锁产生原因和解决方法

    Mysql 锁类型 一、锁类型介绍: MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出...

  • 解决死锁的4种基本方法(值得收藏)

    解决死锁的4种基本方法(文末有惊喜) 1、预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件 2、避免死锁:...

  • 这回帮学弟彻底搞定MySQL数据库死锁

    文章主要介绍mysql数据库死锁的产生原因及解决办法: 数据库和操作系统一样,是一个多用户使用的共享资源。当多个用...

  • Mysql - 死锁

    Mysql - 死锁 死锁,就是产生了循环等待链条,我等待你释放锁,你却等待我释放锁,我们都相互等待,谁也不释放自...

  • 周记 2017 5.8 - 5.14

    Mysql解决死锁问题 参考 死锁(英语:Deadlock),又译为死结,计算机科学名词。当两个以上的运算单元,双...

  • MySql产生死锁问题和解决办法

    产生该问题的原因 Mysql的 InnoDB存储引擎是支持事务的,事务开启后没有被主动Commit。导致该资源被长...

  • 死锁产生条件,怎么解决

    死锁是指两个或两个以上的进程在执行过程中,由于对资源的互斥访问等原因导致这些进程因为缺乏资源而运行不下去,永远相互...

网友评论

      本文标题:mysql死锁的产生和解决

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