iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql怎么防止死锁
  • 594
分享到

mysql怎么防止死锁

2024-04-02 19:04:59 594人浏览 安东尼
摘要

这篇文章主要介绍“Mysql怎么防止死锁”,在日常操作中,相信很多人在mysql怎么防止死锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”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怎么防止死锁”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: mysql怎么防止死锁

本文链接: https://www.lsjlt.com/news/59138.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • mysql怎么防止死锁
    这篇文章主要介绍“mysql怎么防止死锁”,在日常操作中,相信很多人在mysql怎么防止死锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql怎么防止死锁”的疑惑有所帮...
    99+
    2024-04-02
  • redis如何防止死锁
    redis防止死锁的方法:锁信息设置一定是会过期超时的,不允许一个线程长期占有一个锁。同一时刻只能有一个线程获取到锁。代码示例:long expires = System.currentTimeMillis() + expireTime;S...
    99+
    2024-04-02
  • 怎么在java中预防死锁
    这篇文章将为大家详细讲解有关怎么在java中预防死锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Q...
    99+
    2023-06-14
  • 怎么防止redis被系统杀死
    防止redis被系统杀死的方法:禁止外网访问Redis,例如:修改redis.conf 文件中“bind 127.0.0.1”,使得Redis服务仅当前主机可用。将配置文件redis.conf中的“Port 6379”,改成其他端口。设置i...
    99+
    2024-04-02
  • MySQL中怎么排查死锁
    这篇文章将为大家详细讲解有关MySQL中怎么排查死锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。死锁起因先介绍一下数据库和表情况,因为涉及到公司内部真是的...
    99+
    2024-04-02
  • MySQL中怎么实现死锁
    这篇文章将为大家详细讲解有关MySQL中怎么实现死锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.了解锁等待与死锁出现锁等待或死锁的原因是访问数据库需要...
    99+
    2024-04-02
  • mysql中怎么解除死锁
    这篇文章主要介绍了mysql中怎么解除死锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、第一种:查询是否锁表show OPEN TABLES ...
    99+
    2023-06-15
  • ogg怎么防止数据死循环同步
    这篇文章主要讲解了“ogg怎么防止数据死循环同步”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ogg怎么防止数据死循环同步”吧!最近在ORACLE 到MYS...
    99+
    2024-04-02
  • mysql怎么查询死锁的表
    要查询死锁的表,可以使用以下步骤: 执行以下命令,查看当前的死锁情况: SHOW ENGINE INNODB STATUS; ...
    99+
    2024-04-09
    mysql
  • MySQL是怎么处理死锁的
    小编给大家分享一下MySQL是怎么处理死锁的,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、什么是死锁官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己...
    99+
    2024-04-02
  • mysql怎么查询死锁日志
    要查询MySQL的死锁日志,可以按照以下步骤进行操作: 打开MySQL的配置文件(my.cnf或my.ini),找到并编辑以下配...
    99+
    2024-04-09
    mysql
  • MySQL死锁分析
    本篇内容介绍了“MySQL死锁分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!RC 隔离级别很少出GAP...
    99+
    2024-04-02
  • MySQL什么情况下会死锁,发生了死锁怎么处理呢?
    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业...
    99+
    2023-09-22
    mysql 数据库 死锁 innodb 数据库事物 原力计划
  • 详解怎么检测和防止JavaScript死循环
    目录前言在 for 语句中修复无限循环在 while 语句中修复无限循环总结前言 Js死循环是怎么造成的呢!其实在我们写代码时一些不注意或漏写,就写出死循环,就如下面代码: 如果i...
    99+
    2024-04-02
  • mysql日志怎么看是否死锁
    mysql日志看是否死锁的方法:1.在命令行窗口进入mysql的bin目录。2.登录mysql。3.输入mysql密码进入mysql命令行。4.在命令行中输入命令查看记录死锁的mysql日志即可。具体操作步骤:首先,打开cmd并进入MySQ...
    99+
    2024-04-02
  • MySQL死锁怎么检测和避免
    这篇文章主要讲解了“MySQL死锁怎么检测和避免”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL死锁怎么检测和避免”吧! ...
    99+
    2024-04-02
  • mysql死锁怎么排查及解决
    MySQL死锁是指两个或多个事务互相持有对方需要的资源,同时又等待对方释放资源,导致系统无法继续进行下去的情况。解决MySQL死锁问...
    99+
    2023-09-21
    mysql
  • mysql查询死锁语句怎么写
    这篇“mysql查询死锁语句怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql...
    99+
    2023-02-16
    mysql
  • mysql怎么防止sql注入
    要防止SQL注入,可以采取以下措施:1. 使用参数化查询或预编译语句:通过将用户输入的值作为参数传递给查询语句,而不是将其直接拼接到...
    99+
    2023-08-23
    mysql sql
  • MySQL中怎么阅读死锁日志
    MySQL中怎么阅读死锁日志,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。MySQL 5.6 事务隔离级别为RRCREATE TABLE `t...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作