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

mysql怎么防止死锁

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

mysql怎么防止死锁

这篇文章主要介绍“mysql怎么防止死锁”,在日常操作中,相信很多人在mysql怎么防止死锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql怎么防止死锁”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    死锁是事务绕不开的话题,mysql当然也不例外,本文主要模拟一下mysql的死锁,以及应对措施。
    首先看一个参数,默认innodb_print_all_deadlocks参数是关闭。开启后可以将死锁记录到error.log中。否则只能通过show engine innodb status查看。
mysql> SHOW VARIABLES LIKE 'INNODB_PRINT_ALL_DEADLOCKS';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_print_all_deadlocks | OFF   |
+----------------------------+-------+
1 row in set (0.00 sec)

开启innodb_print_all_deadlocks,改参数是全局参数,可以动态调整。
mysql> SET GLOBAL innodb_print_all_deadlocks=1;
Query OK, 0 rows affected (0.00 sec)

表test01上c1是主键,c2是唯一约束。
mysql> show create table test01\G
*************************** 1. row ***************************
       Table: test01
Create Table: CREATE TABLE `test01` (
  `c1` bigint(20) NOT NULL AUTO_INCREMENT,
  `c2` int(11) DEFAULT NULL,
  PRIMARY KEY (`c1`),
  UNIQUE KEY `uidx_test01_c2` (`c2`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> select * from test01;
+----+------+
| c1 | c2   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
3 rows in set (0.00 sec)
会话A
mysql> begin ;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from test01 where c2=2;
Query OK, 1 row affected (0.00 sec)

会话B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from test01 where c2=2;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

会话A
mysql> insert into test01 select 2,2;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
会话A在(2,2)上加了X的行锁,会话B要删除相同的数据行,那么也要在该行上加X的行锁(lock_mode X locks rec but not gap),所以出现了等待(lock_mode X waiting)。后面会话A要插入一行(2,2),因为字段c2上有唯一索引,插入的时候要检查duplicate key的检查,这个过程需要申请S的锁,而在得到这个锁之前,它需要等会话B先得到会话A最开始执行的X锁。也就是说,会话B要等待会话A第一条语句释放X锁,会话A第二条语句又要等待会话B释放X锁,两个会话之间形成了等待的闭合回路,形成了死锁。出现死锁后,mysql会选择一个小事务进行回滚,以解决死锁。
show engine innodb status查看死锁信息,error.log中记录的死锁也类似下面:
------------------------
LATEST DETECTED DEADLOCK
------------------------
2019-07-18 11:11:32 0x7fdc50298700
*** (1) TRANSACTION:
TRANSACTION 713521, ACTIVE 122 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 2 row lock(s)
MySQL thread id 4, OS thread handle 140584214165248, query id 144 localhost root updating
delete from test01 where c2=2
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 25 page no 4 n bits 72 index uidx_test01_c2 of table `ming`.`test01` trx id 713521 lock_mode X waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000002; asc     ;;
 1: len 8; hex 8000000000000002; asc         ;;

*** (2) TRANSACTION:
TRANSACTION 713523, ACTIVE 16 sec inserting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 2
MySQL thread id 3, OS thread handle 140584214431488, query id 146 localhost root executing
insert into test01 select 2,2
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 25 page no 4 n bits 72 index uidx_test01_c2 of table `ming`.`test01` trx id 713523 lock_mode X locks rec but not gap
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000002; asc     ;;
 1: len 8; hex 8000000000000002; asc         ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 25 page no 4 n bits 72 index uidx_test01_c2 of table `ming`.`test01` trx id 713523 lock mode S waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000002; asc     ;;
 1: len 8; hex 8000000000000002; asc         ;;

针对死锁的举措:
1.如果死锁较多的话,那么建议开启innodb_print_all_deadlocks,因为show engine innodb status只显示最近一次的死锁信息。
2.保持事务小而短,并尽快提价
3.避免在一个事务里面修改几张表,或者是同一张表修改不同的结果集
4.可以尝试使用较低的隔离级别,比如RC。也可以使用锁定读
5.建立合适的索引
6.如果应用允许的话,串行化事务

到此,关于“mysql怎么防止死锁”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

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

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

mysql怎么防止死锁

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

下载Word文档

猜你喜欢

Python中死锁的形成示例及死锁情况的防止

死锁示例 搞多线程的经常会遇到死锁的问题,学习操作系统的时候会讲到死锁相关的东西,我们用Python直观的演示一下。 死锁的一个原因是互斥锁。假设银行系统中,用户a试图转账100块给用户b,与此同时用户b试图转账200块给用户a,则可能产生
2022-06-04

怎么在java中预防死锁

这篇文章将为大家详细讲解有关怎么在java中预防死锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Q
2023-06-14

怎么预防和避免死锁

  前几天在网上看见现在有很多人还不知道“死锁的预防和避免”,那么今天编程学习网就来给大家说说,有需要的小伙伴可以参考一下。死锁预防  防止死锁的发生只需破坏死锁产生的四个必要条件之一即可。  1)破坏互斥条件  如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打
怎么预防和避免死锁
2024-04-18

mysql死锁怎么复现

死锁是指多个进程互相等待而无法执行的情况。在 mysql 中,死锁通常发生在更新同一行或多行数据时。复现死锁的步骤:创建数据表并插入数据。开启两个事务并设置锁。尝试更新同一行。提交事务。mysql 通过回滚其中一个事务来解决死锁。避免死锁的
mysql死锁怎么复现
2024-05-30

mysql中怎么解除死锁

这篇文章主要介绍了mysql中怎么解除死锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、第一种:查询是否锁表show OPEN TABLES where In_use >
2023-06-15

剖析6个MySQL死锁案例的原因以及死锁预防策略

MySQL 死锁是面试常问问题,金三银四,所以最近面试相关的文章比较多,本文章是总结的一波死锁问题,和大家分享一下。 Mysql 锁类型和加锁分析 MySQL有三种锁的级别:页级、表级、行级。 **表级锁:**开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲
剖析6个MySQL死锁案例的原因以及死锁预防策略
2015-02-16

mysql怎么查询死锁日志

要查询MySQL的死锁日志,可以按照以下步骤进行操作:打开MySQL的配置文件(my.cnf或my.ini),找到并编辑以下配置项:[mysqld]log-output = FILEgeneral-log = 1general-lo
mysql怎么查询死锁日志
2024-04-09

mysql怎么查看死锁进程

要查看MySQL中的死锁进程,可以使用以下方法:使用SHOW ENGINE INNODB STATUS命令查看当前InnoDB引擎的状态,包括死锁信息。在MySQL客户端中输入以下命令:SHOW ENGINE INNODB STATUS;在
mysql怎么查看死锁进程
2024-05-21

mysql怎么查询死锁的表

要查询死锁的表,可以使用以下步骤:执行以下命令,查看当前的死锁情况:SHOW ENGINE INNODB STATUS;在结果中,查找"InnoDB"部分,找到"LATEST DETECTED DEADLOCK"字样。在该部分下方,会列出
mysql怎么查询死锁的表
2024-04-09

mysql怎么查看死锁信息

在MySQL中,您可以使用以下命令来查看当前的死锁信息:SHOW ENGINE INNODB STATUS;执行以上命令后,会返回一个包含详细信息的结果集,其中包含了当前的事务信息、锁信息以及死锁信息。您可以查看其中的"LATEST DE
mysql怎么查看死锁信息
2024-05-21

mysql怎么避免死锁的产生

这篇文章主要讲解了“mysql怎么避免死锁的产生”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql怎么避免死锁的产生”吧!说明1、等待事务超时,主动回滚。2、进行死锁检查,主动回滚某一
2023-06-20

mysql死锁怎么排查及解决

MySQL死锁是指两个或多个事务互相持有对方需要的资源,同时又等待对方释放资源,导致系统无法继续进行下去的情况。解决MySQL死锁问题需要进行以下步骤:1. 确认死锁:可以通过查看MySQL错误日志来确认是否发生死锁。错误日志中会记录死锁的
2023-09-21

编程热搜

目录