一、什么是死锁(Deadlock)??

所谓死锁,是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

二、产生死锁的原因:

  • 系统资源不足。
  • 进程运行推进的顺序不合适。
  • 资源分配不当等。
  • 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

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

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

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

四、死锁的预防:

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。下列方法有助于最大限度地降低死锁:

  1. 按同一顺序访问对象:如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。将存储过程用于所有的数据修改可以标准化访问对象的顺序。
  2. 避免事务中的用户交互:避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度。因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。
  3. 保持事务简短并在一个批处理中:在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。
  4. 使用低隔离级别:确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。
  5. 使用绑定连接:使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。

五、死锁的解决方案:

  1. 查看进程,删除进程

    1. 查询是否锁表:SHOW OPEN TABLES WHERE In_use > 0;
    2. 查询进程(需要有SUPER权限,查看所有线程;否则只能看到您自己的线程):SHOW PROCESSLIST
    3. 杀死进程id(就是 SHOW PROCESSLIST 的 id列):KILL id
  2. 查看事物,删除食物
    1. 查看 在锁的事务:SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
    2. 杀死进程id(就是上面命令的trx_mysql_thread_id列):KILL id

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

Mysql 死锁问题相关推荐

  1. java mysql死锁_记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...

  2. mysql查询死锁的次数_一次神奇的MySQL死锁排查记录

    一次神奇的MySQL死锁排查记录 发布时间:2020-08-29 00:50:26 来源:脚本之家 阅读:135 作者:咖啡拿铁 背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对 ...

  3. MySQL死锁如何处理

    转载自  MySQL死锁如何处理 前提 笔者负责的一个系统最近有新功能上线后突然在预警模块不定时报出MySQL死锁导致事务回滚.幸亏,上游系统采用了异步推送和同步查询结合的方式,感知到推送失败及时进行 ...

  4. mysql 死锁监视器_并发基础知识:死锁和对象监视器

    mysql 死锁监视器 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如原 ...

  5. mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路

    前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...

  6. go语言 mysql卡死_一次mysql死锁的排查过程-Go语言中文社区

    一次mysql死锁的排查过程一.背景17号晚上要吃饭了,看旁边的妹子和佐哥还在调代码,就问了下什么问题啊,还在弄,妹子说,在测试环境测试给用户并发发送卡券时,出现了死锁,但看代码没有死锁,问题如下图 ...

  7. zabbix监控mysql死锁

    percona MySQL Server Template算是比较常用的zabbix监控mysql的模板了,监控项也比较齐全,但是没有监控mysql死锁的监控项,如果有需求,就需要另外创建模板或者监控 ...

  8. 一次MySQL死锁问题解决

    一次MySQL死锁问题解决 一.环境 CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日 ...

  9. mysql死锁语句_记一次神奇的Mysql死锁排查

    背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对于一些基本的Mysql锁或者死锁都有一个简单的认识,可以看下这篇文章为什么开发人员需要了解数据库锁.有了上面的经验之后,本以为对于 ...

  10. mysql排插问题_手把手教你分析 MySQL 死锁问题

    原标题:手把手教你分析 MySQL 死锁问题 前言 前几天跟一位朋友分析了一个死锁问题,所以有了这篇图文详细的博文,哈哈~ 发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题 准备好数据环境 模 ...

最新文章

  1. 装了BT5后要做的几件事
  2. CodeBlocks 更改 gui 程序为 命令行
  3. JavaScript学习笔记(7)PC端网页特效(略)
  4. java image类的值_关于在java中保存image类型的字段的问题
  5. 手机号码归属地及运营商查询
  6. Kubernetes—如何批量删除对象资源?(二十三)
  7. EFCore-一对一配置外键小记
  8. spring之AOP
  9. 服务器如何备份系统和配置,windows server 2008和2012如何设置完整备份+增量备份
  10. 衡量经济活动的价值:国内生产总值(GDP, Gross Domestic Product)
  11. R语言入门——rep函数
  12. html5条件筛选jquery,jQuery实现多条件筛选
  13. [POI2005]Sza-Template
  14. 这个在线文本编辑器的源代码
  15. 组建局域网共享上网全过程
  16. CoppeliaSim基础:页面、视图、可视对象(相机/视觉传感器)
  17. NSSCTF Round#8 web专项赛
  18. 4G智能音箱技术方案开发
  19. 多分类条件下分类指标:Macro-average和Micro-average,以及Weighted-average
  20. 【C语言】案例六十一 综合案例:密码

热门文章

  1. std::string::npos的使用
  2. string类型转LPCWSTR
  3. week11 Open3D点云数据处理
  4. 核密度估计(细节拿捏,到底怎么算告诉你)
  5. JS 去除输入框里面空格、英文字符、换行符
  6. Google如何识别重复内容的主要版本
  7. 网站出现提示 该内容被禁止访问 的解决办法
  8. 分布式数据库的应用场景
  9. 使用SQL创建视图和存储过程
  10. 伤心SSL暑期培训 Day 9