20.3.9 关于死锁 深入浅出MySQL——数据库开发、优化与管理维护

深入浅出MySQL——数据库开发、优化与管理维护

回书目   上一节   下一节

 

20.3.9 关于死锁

http://book.51cto.com  2008-03-27 23:07  唐汉明 翟振兴 兰丽华 关宝军 申宝柱  人民邮电出版社   我要评论(0)
  • 摘要:《深入浅出MySQL——数据库开发、优化与管理维护》从数据库的基础、开发、优化、管理4方面对MySQL进行了详细的介绍,其中每一部分都独立成篇,每一篇又包括多个章节。本书面向实用,内容覆盖广泛,讲解由浅入深,适合于各个层次的读者。本文介绍了InnoDB锁。
  • 标签:MySQL  数据库  InnoDB

 

20.3.9 关于死锁

上文讲过,MyISAM表锁是deadlock free的,这是因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在InnoDB中,除单个SQL组成的事务外,锁是逐步获得的,这就决定了在InnoDB中发生死锁是可能的。如表20-17所示的就是一个发生死锁的例子。

表20-17           InnoDB存储引擎中的死锁例子

 

session_1

 

session_2

 

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from table_1 where where id=1 for update;

...

做一些其他处理...

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from table_2 where id=1 for update;

...

 

select * from table_2 where id =1 for update;

因session_2已取得排他锁,等待

做一些其他处理...

 

 

 

 

 

mysql> select * from table_1 where where id=1 for update;

死锁

 

在上面的例子中,两个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是典型的死锁。

发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。但在涉及外部锁,或涉及表锁的情况下,InnoDB并不能完全自动检测到死锁,这需要通过设置锁等待超时参数innodb_lock_wait_timeout来解决。需要说明的是,这个参数并不是只用来解决死锁问题,在并发访问比较高的情况下,如果大量事务因无法立即获得所需的锁而挂起,会占用大量计算机资源,造成严重性能问题,甚至拖跨数据库。我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。

通常来说,死锁都是应用设计的问题,通过调整业务流程、数据库对象设计、事务大小,以及访问数据库的SQL语句,绝大部分死锁都可以避免。下面就通过实例来介绍几种避免死锁的常用方法。

(1)在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会。在下面的例子中,由于两个session访问两个表的顺序不同,发生死锁的机会就非常高!但如果以相同的顺序来访问,死锁就可以避免。

表20-18  InnoDB存储引擎中表顺序造成的死锁例子

 

session_1

session_2

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select first_name,last_name from actor where actor_id = 1 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| PENELOPE   | GUINESS   |

+------------+-----------+

1 row in set (0.00 sec)

 

 

mysql> insert into country (country_id,country) values(110,'Test');

Query OK, 1 row affected (0.00 sec)

mysql>  insert into country (country_id,country) values(110,'Test');

等待

 

 

mysql> select first_name,last_name from actor where actor_id = 1 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| PENELOPE   | GUINESS   |

+------------+-----------+

1 row in set (0.00 sec)

mysql>  insert into country (country_id,country) values(110,'Test');

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

 

 

(2)在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大降低出现死锁的可能。

表20-19  InnoDB存储引擎中表数据操作顺序不一致造成的死锁例子

 

session_1

session_2

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select first_name,last_name from actor where actor_id = 1 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| PENELOPE   | GUINESS   |

+------------+-----------+

1 row in set (0.00 sec)

 

 

mysql> select first_name,last_name from actor where actor_id = 3 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| ED         | CHASE     |

+------------+-----------+

1 row in set (0.00 sec)

mysql> select first_name,last_name from actor where actor_id = 3 for update;

等待

 

 

mysql> select first_name,last_name from actor where actor_id = 1 for update;

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

mysql> select first_name,last_name from actor where actor_id = 3 for update;

+------------+-----------+

| first_name | last_name |

+------------+-----------+

| ED         | CHASE     |

+------------+-----------+

1 row in set (4.71 sec)

 

深入解析死锁:原理、检测与解决方案 死锁是计算机系统中多个进程因争夺资源而相互等待的现象,其核心原理涉及互斥条件、占有并等待、非抢占条件和循环等待四个必要条件。在数据库系统与多线程编程等高并发场景中,死锁问题尤为常见,可能导致系统响应变慢甚至崩溃。通过资源分配图算法和数据库内置机制可以检测死锁,而预防策略包括破坏死锁必要条件或采用银行家算法等避免技术。实际工程中,保持事务简短、按固定顺序获取锁、设置合理超时等方法能有效减少死锁发生。针对MySQL、Java等不同环境,文章提供了具体的死锁诊断命令和解决方案,帮助开发者快速定位和解决这类并发问题 阅读详情

相关推荐

Java开发校招面试考点汇总第六篇:数据库及MySQL练习题

https://www.cnblogs.com/SJP666/p/4665605.html 1、有子查询的时候先做子查询,再使用子查询的值 2、DESC只作用于前面的一列 SELECT * FROM Student ORDER BY class,sno DESC 3、练习题: 一、创建数据库和表 create database ZuoYe--创建数据库 use ZuoYe--使用数据库 cre...

u014138443的博客 4261

mysql关于死锁的优化_20.3.9 关于死锁 深入浅出MySQL——数据库开发、优化与管理维护...

20.3.9 关于死锁上文讲过,MyISAM表锁是deadlock free的,这是因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在InnoDB中,除单个SQL组成的事务外,锁是逐步获得的,这就决定了在InnoDB中发生死锁是可能的。如表20-17所示的就是一个发生死锁的例子。表20-17 InnoDB存储引擎中的死锁例子session_...

weixin_33181210的博客 217

【嵌入式】树莓派部署NCNN的YOLOv5模型

树莓派部署NCNN框架的YOLOv5模型

Ace_Spade的博客 3783

内网负载产生mysql注入_深入浅出MySQL数据库开发、优化与管理维护

资料简介:本文档来自网易技术部第一篇 开发篇 8第1章 帮助的使用 81.1 按照层次看帮助 81.2 快速查阅帮助 10第2章 表类型(存储引擎)的选择 112.1 Mysql存储引擎概述 112.2 各种存储引擎的特性 112.3 如何选择合适的存储引擎 12第3章 选...

weixin_33632298的博客 155

IC设计效率翻倍!Verilog-mode的AUTOWIRE/AUTOINST组合使用技巧

本文详细介绍了在Emacs的verilog-mode插件中,如何组合使用AUTOWIRE与AUTOINST功能,实现Verilog代码的智能自动化连接与维护。通过声明式编程思想,该组合能自动生成模块实例化连接和线网声明,并配合AUTO_TEMPLATE处理复杂映射,从而大幅提升IC顶层设计的效率和可靠性,减少手动连线的错误。

weixin_28826545的博客 319

AMBA-ATB spec

AMBA-ATB spec 1. ATB总线的用途及版本 1.1 ATB总线用途 一般来说,ATB(Advanced Trace Bus)总线用来在ARM的coresight组件之间传递trace数据。如下图所示: 1.2 ATB总线的版本 ATB(Advanced Trace Bus)共有两个版本,其中v1.0作为AMBA3的一部分,于2006年发布的,而v1.1则是2012年随着AMBA4发布的。ATB规范新增了数据(主要针对trace data)不可知的接口,以便在跟踪系统中根据 AMBA 规范跟

weixin_43781229的博客 7348

深入浅出的mysql第三版和第二版的区别_1.高性能MySQL(第3版) 2. 深入浅出MySQL 合集 完整版 高清...

1.高性能MySQL(第3版) 2. 深入浅出MySQL 合集 完整版 高清ab9dde在2018-06-19 16:06:36上传74.18 MB高性能深入浅出MySQL“只要你不敢以MySQL专家自诩,又岂敢错过这本神书?”第3 版更新了大量的内容,不但涵盖了MySQL5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能...

weixin_34123197的博客 757

麒麟V10服务器多硬盘安装与分区实战:告别自动分区,手动分配/boot、swap和/根目录

本文详细介绍了麒麟V10服务器在多硬盘环境下的手动分区策略,包括/boot、swap和/根目录的优化分配方案。通过SSD与HDD混合存储架构的合理规划,提升系统性能和运维效率,适用于企业级定制化系统部署需求。

weixin_26976635的博客 407

mysql查询数据表死锁

MySQL查询中的数据表死锁问题解析 在数据库的日常使用中,死锁是一个常见的问题,尤其是在高并发的环境下。死锁发生在两个或多个事务试图以不同的顺序获取相同的资源,从而导致它们都无法继续执行。本文将探讨MySQL查询中的数据表死锁问题,包括死锁的原因、诊断方法以及解决策略。 死锁的原因 死锁通常发生在以下情况: 多个事务同...

weixin_35907524的博客 145

自抗扰控制(ADRC)原理与MATLAB实现详解

自抗扰控制(ADRC)是一种先进的鲁棒控制策略,其核心在于通过扩张状态观测器(ESO)实时估计并补偿系统总扰动。相比传统PID控制,ADRC不依赖精确数学模型,特别适合处理非线性、时变系统。从控制原理看,ADRC将系统内部动态和外部扰动统一建模,通过带宽参数化方法实现快速响应与强抗扰能力。在工程实践中,ADRC已成功应用于无人机飞控、伺服系统等场景,MATLAB仿真显示其上升时间可比PID提升46%,抗扰动恢复时间缩短60%。典型实现包含ESO设计、扰动补偿和PD控制三部分,参数整定遵循ω₀=3~5倍系统带

weixin_33585822的博客 95

小龙虾OpenClaw卸载全攻略,彻底清理缓存和配置,干净无残留!

不想要的小龙虾OpenClaw怎么彻底卸载?🦞本文教你如何彻底的卸载OpenClaw⚡️,Windows/macOS/Linux通用,干净无残留🧹

XiaoqiangClub的博客 313

MySQL数据库常见面试题总结

1、数据库中的范式: (1)第一范式(1NF):指表的列不可再分,数据库中表的每一列都是不可分割的基本数据项,同一列中不能有多个值; (2)第二范式(2NF):在 1NF 的基础上,还包含两部分的内容:一是表必须有一个主键;二是表中非主键列必须完全依赖于主键,不能只依赖于主键的一部分; (3)第三范式(3NF):在2NF 的基础上,消除非主键列对主键的传递依赖,非主键列必须直接依赖于主键。 (4)BC范式(BCNF):在 3NF 的基础上,消除主属性对于码部分的传递依赖 2、SQL语句的执..

张维鹏的博客 6万+

【C++】【STL算法】数据窄化及代码安全性

本文系统探讨了C++工程中数据窄化(narrowing conversion)的隐患与解决方案。数据窄化指将高精度/大范围类型转换为低精度/小范围类型,虽语法合法但会导致静默精度损失。其危险性体现在:错误隐蔽、STL会放大问题、数值错误具有传播性。现代C++要求窄化必须显式声明,文中提出四种工程解决方案:显式转换、边界统一转换、范围检查转换和使用GSL工具。建议在系统边界集中处理窄化,保持计算链路类型一致性,并通过分层策略(建模用double,控制用float)确保数值稳定性。核心思想是让窄化成为清晰可控的

Double Galaxy 80

视频教程-sql server 性能优化和日常管理维护-SQL Server

sql server 性能优化和日常管理维护 信息系统项目管理师, 系统集成...

weixin_29078919的博客 431

基于Simulink的PID控制器自动驾驶仿真建模示例

本文通过Simulink仿真平台,详细讲解了基于PID控制器的自动驾驶路径跟踪实现方法。主要内容包括:1)建立自行车运动学模型作为被控对象;2)定义参考路径与横向误差计算方法;3)设计PD控制器并调试参数;4)在Simulink中搭建完整仿真模型;5)分析30km/h车速下的双移线跟踪性能。文章强调PID控制作为自动驾驶入门基础的重要性,并指出其在中低速场景下的适用性,同时给出了工程实践中的优化建议(如前视距离、抗积分饱和等)和扩展方向(如Stanley控制器)。通过完整案例,帮助读者掌握车辆运动学建模和P

xiaoheshang_123的博客 65

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MySql数据库

B + 树的高度相对较低,通常比二叉树和 B 树要低得多。这是因为 B + 树的节点可以存储更多的键值对,从而减少了树的层次。较低的树高度意味着在进行数据检索时,需要进行的磁盘 I/O 次数较少,从而提高了查询性能。隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离。不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

彼岸花开 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL优化方法总结

根据应用需求,适当调整MySQL的配置参数,如max_connections(最大连接数)、innodb_buffer_pool_size(InnoDB缓冲池大小)、key_buffer_size(MyISAM缓冲区大小)等。7.包含了ORDER BY、GROUP BY、DISTINCT 这些查询的语句,WHERE 条件过滤出来的结果集请保持在1000行以内,否则SQL会很慢。对于读多写少的数据库,启用查询缓存可以提高查询性能。将数据表进行垂直分割,将数据量大的字段分离出来,以减少表的宽度,提高查询性能。

indiansummer_的博客 1403

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

金蝶星空支持mysql吗_金蝶云星空K3 CLOUD SQL 数据库优化

--微信号:wuyongsoftware 邮箱:wuyongsoftware@163.com--1.Enterprise Edition (64-bit)SELECT SERVERPROPERTY("Edition")--2.Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Feb 20 2014 20:04:26 Copyright (c) Micros...

weixin_35712571的博客 2486

MySQL数据库CRUD操作全解析与优化实践

关系型数据库是现代应用开发的核心组件,其中MySQL凭借其开源特性和稳定性能成为最流行的选择之一。数据库操作的本质围绕CRUD(创建、读取、更新、删除)展开,这是所有开发者必须掌握的基础技能。通过合理的索引设计和SQL优化,可以显著提升查询性能,特别是在处理大数据量时。在实际项目中,CRUD操作广泛应用于用户管理、订单处理等业务场景。本文以MySQL 8.0为例,详细解析INSERT、SELECT、UPDATE、DELETE等核心语句的使用技巧,并分享索引优化、事务控制等实战经验,帮助开发者规避常见性能陷阱

weixin_30654583的博客 308

总结之MySQL数据库结构优化

MySQL两种常用存储引擎分析 MyISAM MySQL5.5之前版本默认存储引擎 其中系统表、临时表(在排序、分组等操作中,当数量超过一定的大小之后,由查询优化器建立的临时表)使用MyISAM 特性:表级锁、并发性不行、可以表损坏修复、支持全文索引、支持数据压缩 限制:版本<MySQL5.0时默认表大小为4G,版本>MySQL5.0是默认表大小>256TB 适用场景: 非事务型...

IManiy的博客 337

【Mysql】Mysql8日常优化经验分享

MySQL 8.0 带来了许多新特性和性能改进,对于数据库管理员和开发者来说,了解这些更改并进行适当的优化是非常重要的。

TradingAgents-CN专栏 2203

mysql 列出所有的表_MySQL高级管理与性能调优最佳实践

开课时间北京12月17-20日什么是数据库调优?数据库优化是一项很复杂的工作,是包含但不限于对系统搜索、读/写、CPU周期、内存带宽等方面,进行性能优化,最终达到数据库整体性能提升的目的。报名MySQL课程能学到什么?1.了解MySQL数据库文件结构;2.管理配置多MySQL数据库实例;3.MySQL系统变量的设置,数据库启停;4.创建并管理MySQL数据库用户、权限管理和安全审计;5....

weixin_39869733的博客 127

MySQL CRUD操作高级技巧与性能优化实战

数据库CRUD操作是数据处理的基础,包含创建(Create)、读取(Read)、更新(Update)和删除(Delete)四种核心操作。在MySQL中,通过索引优化、事务控制和存储引擎选择等技术手段,可以显著提升CRUD操作效率。InnoDB存储引擎凭借其行级锁和事务支持,成为高并发场景的首选。实战中,批量插入比单条插入快5-10倍,而EXPLAIN分析工具能帮助开发者理解查询执行计划。这些优化技巧在电商、金融等需要处理高并发请求的业务系统中尤为重要,能有效解决慢查询、锁竞争等性能瓶颈问题。

weixin_30635053的博客 453

MySQL数据库性能优化的十个核心技巧与实践策略

编写高效的SQL语句是性能优化的基础。MySQL的查询缓存可以存储SELECT查询的结果集,当相同的查询再次执行时可直接返回缓存结果。在MySQL 8.0中查询缓存已被移除,对于使用旧版本的用户,在读多写少的场景中可以适当启用查询缓存,而在写密集的场景中建议关闭。在当今数据驱动的世界中,MySQL作为最受欢迎的关系型数据库管理系统之一,其性能直接影响着应用程序的响应速度和用户体验。通过系统化的性能优化,可以确保MySQL数据库在高负载下仍能保持稳定高效的运行,为业务发展提供坚实的数据支撑。

zxly1210的博客 626

MySQL数据库十大热点问题

关于MySQL的一些热点问题

weixin_44929475的博客 982

面试时常会被问到的mysql问题:二

自动处理:依赖InnoDB的死锁检测和自动回滚机制。应用处理:捕获错误并重试事务。优化操作:减少锁持有时间、简化事务、遵循一致的锁顺序。使用工具:监控和分析死锁情况,优化数据库设计。通过应用这些策略,可以有效减少和解决MySQL中的死锁问题,提高数据库系统的稳定性和性能。:提供详细的死锁信息。错误日志:记录了死锁事件及其详细信息。:可以查询锁和锁等待信息。:帮助识别可能的锁竞争和长时间运行的事务。:开启死锁日志打印。通过这些方法,可以获取有关死锁的详细信息,从而帮助分析和解决死锁问题。

程序员诚哥 1452
上一篇: Java 内存溢出的可能性汇总
下一篇: mysql innodb 配置详解
mlxia
博客等级 码龄26年 28粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值