当多个事务同时持有和请求同一资源上的锁而产生循环依赖的时候就产生了死锁,解决方法为: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来确定最后一个死锁的原因。这样可以帮助你调节应用程序来避免死锁。
白瓜面试
白瓜面试 - AI面试助手,辅助笔试面试神器
162
查看详情
总是准备着重新发出事务,如果它因为死锁而失败了。死锁不危险,再试一次。
经常提交你的事务。小事务更少地倾向于冲突。
如果你正使用锁定读,(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死锁的原因和处理方法是什么的详细内容,更多请关注其它相关文章!
# 死锁
# 要如何建设网站
# seo询问5火星
# 建设网站教程免费
# 影棚推广视频素材下载网站
# 或删除
# 应用程序
# 多个
# 你可以
# 是因为
# 如果你
# 解锁
# 镜像
# 更少
# MySQL
# seo工资怎么提升
# 新产品营销推广语录英文
# 政府网站信息建设需求
# 好喝的咖啡网购网站推广
# 企业建设网站的规划
# 网络营销的推广策略
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
《百度畅听版》关闭兴趣推荐方法
win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】
我的世界游戏平台入口 我的世界官方官网直达链接
视频号视频怎么免费保存到相册?保存到相册需要注意什么?
花生壳内网映射新方案
悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口
《绝区零》2.3前瞻|直播|内容介绍
抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系
Python对象引用与属性赋值:理解链表中的行为
抖音号升级企业号怎么改名字?升级企业号有哪些好处?
PHP utf8_encode 字符编码转换疑难解析与最佳实践
《金山词霸》语音翻译方法
126邮箱申请入口官网_126邮箱注册免费登录2025
《搜书吧》阅读书籍方法
Win11如何分屏操作_Win11多窗口分屏技巧
Safari浏览器自动填表功能失效怎么办 Safari表单管理修复
cad怎么隐藏指定的图层_cad隐藏或冻结图层方法
小红书如何引流到私信?引流到私信有用吗?
12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化
《洛克王国:世界》国家队搭配攻略
《顺丰同城骑士》查看我的技能方法
悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置
手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】
c++如何链接Boost库_c++准标准库的集成与使用
CSS如何控制元素外边距_margin实现布局间隔
谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法
英国搜索:多数英国人认为语言搜索是未来搜索
Golang如何使用log记录日志信息_Golang log日志记录方法总结
支付宝登录刷脸不是本人如何解决
快手网页版官方访问 快手网页版页面在线打开
QQ网站入口直接登录 QQ官方正版登录页面
在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程
PHP与SQL实践:高效实现数据复制与特定列值修改
如何查询个人病历记录
有道AI翻译入口 智能写作官方网站入口
使用jQuery精确检测除指定元素外任意位置的点击事件
路由器DNS怎么设置最快 优化DNS提升上网速度教程
微博网页版访问入口 微博网页版网页端使用指南
铁路12306座位怎么选_12306官方选座操作方法
5G和6G的连接密度有什么区别 6G每平方公里能连接多少设备
c++类和对象到底是什么_c++面向对象编程基础
《下一站江湖2》风神腿获取攻略
AI图层蒙版怎么用_AI图层蒙版应用技巧与设计实例
谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录
123平台官方登录入口 123邮箱网页端在线沟通工具
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
苹果如何下载nanobanana
解决PHP MySQL数据库更新无响应:SQL查询语法错误解析
《下一站江湖2》武器获取方法
J*aScript与HTML元素交互:图片点击事件与链接处理教程
2021-07-12
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。