我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql死锁的原因和解决方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql死锁的原因和解决方法是什么

这篇文章主要讲解了“mysql死锁的原因和解决方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql死锁的原因和解决方法是什么”吧!

当多个事务同时持有和请求同一资源上的锁而产生循环依赖的时候就产生了死锁,解决方法为:1、用更低的隔离级别;2、以固定的顺序访问你的表和行;3、添加精心选定的索引到表中;4、使用更少的锁定。

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

当多个事务同时持有和请求同一资源上的锁而产生循环依赖的时候就产生了死锁。死锁发生在事务试图以不同的顺序锁定资源。以StockPrice表上的两个事务为例:

事务1

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;

事务 #2

START TRANSACTION;
UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET;
COMMIT;

如果不走运的话,每个事务都可以执行完第一个语句,并在过程中锁住资源。然后每个事务都试图去执行第二行语句,当时却发现它被锁住了。两个事务将永远的等待对方完成,除非有其他原因打断死锁。

为了解决这个问题,数据库实现了各种死锁探查和超时机制。像InnoDB这样复杂的存储引擎会提示循环依赖并且立即返回错误。否则死锁将会导致查询非常缓慢。其他一些不好的做法是等待超时后放弃。当前InnoDB处理死锁的方式是回滚持有最少排他行级锁的事务。(几乎最简单的回滚的参考指标)

锁的行为是顺序是存储引擎决定的。因此,一些存储引擎可能会在特定的操作顺序下发生死锁,其他的可能没有。死锁有两种:一些是因为实际数据冲突而无法避免,一些是因为存储引擎的工作方式产生。

只有部分或者完全回滚其中的一个事务才可能打破死锁。死锁是事务系统中客观存在的事实,你的应该在设计上必须应该考虑处理死锁。一些业务系统可以从头重试事务。

如何处理死锁
死锁是事务型数据库典型的问题,但是除非它们频繁出现以至于你更本不能运行某个事务,它们一般是不危险的。正常地,你必须编写你的应用程序使得它们总是准备如果因为死锁而回滚一个事务就重新发出一个事务。

InnoDB使用自动行级锁定。即使在只插入或删除单个行的事务的情况下,你可以遇到死锁。这是因为这些操作不是真正的“极小的”,它们自动对插入或删除的行的(可能是数个)索引记录设置锁定。

你可以用下列技术对付死锁减少它们发生的可能性:

用Use SHOW INNODB STATUS来确定最后一个死锁的原因。这样可以帮助你调节应用程序来避免死锁。

总是准备着重新发出事务,如果它因为死锁而失败了。死锁不危险,再试一次。

经常提交你的事务。小事务更少地倾向于冲突。

如果你正使用锁定读,(SELECT ... FOR UPDATE或 ... LOCK IN SHARE MODE),试着用更低的隔离级别,比如READ COMMITTED。

以固定的顺序访问你的表和行。则事务形成良好定义的查询并且没有死锁。

添加精心选定的索引到你的表。则你的查询需要扫描更少的索引记录并且因此设置更少的锁定。使用EXPLAIN SELECT来确定对于你的查询,MySQL认为哪个索引是最适当的。

使用更少的锁定。如果你可以接受允许一个SELECT从一个旧的快照返回数据,不要给它添加FOR UPDATE或LOCK IN SHARE MODE子句。这里使用READ COMMITTED隔离级别是比较好的,因为每个在同一事务里的持续读从它自己新鲜的快照里读取。

如果没有别的有帮助的了,用表级锁定系列化你的事务。用LOCK TABLES对事务型表(如InnoDB)的正确方法是设置AUTOCOMMIT = 0 并且不调用UNLOCK TABLES直到你明确地提交了事务。例如,如果你需要写表t1并从表t读,你可以按如下做:

SET AUTOCOMMIT=0;

LOCK TABLES t1 WRITE, t2 READ, ...;

[do something with tables t1 and t2 here];

COMMIT;

UNLOCK TABLES;

表级锁定使得你的事务很好地排队,并且死锁被避免了。

领一个系列化事务的方法是创建一个辅助的“semaphore” 表,它只包含一个单行。让每个事务在访问其它表之前更新那个行。以这种方式,所有事务以序列的方式发生。注意,InnoDB即时死锁检测算法也能在这种情况下起租用,因为系列化锁定是行级锁定。超时方法,用MySQL表级锁定,必须被用来解决死锁。

在应用程序中使用LOCK TABLES命令,如果AUTOCOMMIT=1,MySQL不设定InnoDB表锁定。

感谢各位的阅读,以上就是“mysql死锁的原因和解决方法是什么”的内容了,经过本文的学习后,相信大家对mysql死锁的原因和解决方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql死锁的原因和解决方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

sql死锁的原因及解决方法是什么

SQL死锁是指在多个并发事务中,每个事务都在等待其他事务所持有的资源,导致所有事务都无法继续执行的状态。死锁的原因主要有以下几种:1. 互斥条件:每个事务需要的资源不能被共享,只能独占。2. 持有并等待:一个事务在等待其他事务所持有的资源时
2023-08-16

死锁之谜:探究数据库死锁的原因和解决方案

数据库死锁是一种常见的数据库问题,它会导致事务无法继续执行,进而影响数据库的性能和可用性。本文将探讨数据库死锁的原因并提供相应的解决方案,帮助您有效避免和解决数据库死锁问题。
死锁之谜:探究数据库死锁的原因和解决方案
2024-02-05

MySQL死锁的产生原因以及解决方案

数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重
2022-05-15

mysql死锁排查及解决的方法是什么

MySQL死锁是指两个或多个事务相互等待对方持有的资源,导致无法继续执行的情况。为了排查和解决MySQL死锁,可以采取以下方法:1. 记录死锁信息:MySQL的日志文件中会记录死锁信息,可以通过查看错误日志或使用SHOW ENGINE IN
2023-08-16

windows电脑死机的原因及解决方法是什么

windows电脑死机的原因及解决方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 很多人在使用电脑过程中会遇到各种各样的问题。比如说,电脑死机、甚至连续死机
2023-06-14

Python中死锁产生的原因是什么

这篇文章给大家介绍Python中死锁产生的原因是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5
2023-06-14

mysql查看死锁的方法是什么

要查看MySQL中的死锁,可以使用以下方法:使用SHOW ENGINE INNODB STATUS命令来查看当前的死锁情况。该命令会返回一个包含详细信息的InnoDB状态报告,其中包含了当前的死锁信息。使用SELECT FROM INF
mysql查看死锁的方法是什么
2024-04-09

linux中产生死锁的原因是什么

这篇“linux中产生死锁的原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux中产生死锁的原因是什么”文章吧
2023-06-29

win11频繁桌面假死的原因及解决方法是什么

Windows 11频繁桌面假死的原因可能包括以下几点:1. 硬件兼容性问题:某些硬件设备(如显卡、声卡等)不兼容Windows 11,可能导致系统频繁崩溃或桌面假死。2. 软件冲突:某些已安装的软件与Windows 11不兼容,导致系统出
2023-08-19

Windows 8下QQ卡死的原因和解决方法

Windows 8 CP出来,不少用户尝鲜用上了,在Windows Store应用商店也提供了QQ下载。但是有用户发现,登录Win8QQ进入联系人列表会出现卡死的Bug。腾讯官方给出的QQ卡死故障解决方法在登录Win8QQ,进入联系人列表出
2022-06-04

MySQL无响应的原因及解决方法是什么

MySQL无响应的原因及解决方法有很多,下面列举一些常见的原因及解决方法:1. 过多的并发连接:当MySQL服务器上的并发连接数过多时,可能会导致服务器无响应。解决方法可以是增加服务器的硬件资源,如增加CPU、内存等,或者通过调整MySQL
2023-10-18

MySQL打不开的原因及解决方法是什么

MySQL打不开的原因有很多,并且需要根据具体情况来进行排查和解决。以下是一些常见的原因和解决方法:MySQL服务未启动:检查MySQL服务是否已经启动,可以使用命令行或者服务管理工具来启动MySQL服务。解决方法:启动MySQL服务。端
MySQL打不开的原因及解决方法是什么
2024-02-29

编程热搜

目录