首页 > 数据库 >MySQL 死锁处理

MySQL 死锁处理

时间:2025-01-19 18:34:11浏览次数:1  
标签:事务 name temp 处理 死锁 MySQL 超时 id

死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。

1 数据库层面解决死锁的两种方式

1、解决死锁的问题最简单的方式是不要有等待,将任何的等待都转化为回滚,并且事务重新开始。 
这种没有死锁问题的产生。在线上环境中,可能导致并发性能的下降,甚至任何一个事务都不能进行。而这锁带来的问题远比死锁问题更为严重,而这锁带来的问题原题远比死锁问题更为严重,因为这很难被发现并且浪费资源。

2、解决死锁的问题最简单的一种方法时超时,即当两个事务互相等待是,当一个等待时超过设置的某一阈值是,其中一个事务进行回滚,另一个等待的事务就能继续进行。用innodb_lock_wait_timeout用来设置超时的时间。

超时机制虽然简单,仅通过超时后对事务进行回滚的方式来处理,或者说其根据FIFO的顺序选择回滚对象。但若超时的事务所占权重比较大,如事务操作更新很多行(比如某程序猿用死循环来执行一些事务),占用了较多的undo log,这是采用FIFO 的方式,就显得不合适了,因为回滚这个事务的时间相对另一个事务所占用的时间可能会更多。

 

在mysql 5.7.x 和 mysql 5.6.x 对死锁采用的方式: 
mysql 5.6.x 是用锁等待(超时)的方式来解决, 没有自动解决死锁的问题:

 

 mysql 5.7.x 默认开启了死锁保护机制:

 

2 死锁演示

如果程序是串行的,那么不可能发生死锁。死锁只存在于并发的情况,而数据库本身就是一个并发运行的程序,因此可能会发生死锁。

死锁示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a :创建表 create table temp(id int primary key ,name varchar(10)); insert into temp values(1,'a'),(2,'b'),(3,'c'); 此时表里只有3条数据   执行步骤根据数据顺序来: 1. 事务1: start transaction; update temp set name='aa' where id=1;   2. 事务2: start transaction; update temp set name='bb' where id=2;     3. 事务1:update temp set name='aaa' where id=2;    这时候3的步骤会有锁等待, 立马执行4,就会马上产生死锁 4. 事务2: update temp set name='bbb' where id=1;

  

 

3 避免死锁发生的方法

在事务性数据库中,死锁是个经典的问题,但只要发生的频率不高则死锁问题不需要太过担心 
死锁应该非常少发生,若经常发生,则系统是不可用。

查看死锁的方法有两种: 
通过show engine innodb status命令可以查看最后一个死锁的情况 
通过innodb_print_all_deadlocks参数配置可以将所有死锁的信息都打印到MySQL的错误日志中

减少死锁发生的方法: 

1、尽可能的保持事务小型化,减少事务执行的时间可以减少发生影响的概率 
2、及时执行commit或者rollback,来尽快的释放锁 
3、当要访问多个表数据或者要访问相同表的不同行集合时,尽可能的保证每次访问的顺序是相同的。比如可以将多个语句封装在存储过程中,通过调用同一个存储过程的方法可以减少死锁的发生 
4、增加合适的索引以便语句执行所扫描的数据范围足够小 
5、尽可能的少使用锁,比如如果可以承担幻读的情况,则直接使用select语句,而不要使用select…for update语句 
6、如果没有其他更好的选择,则可以通过施加表级锁将事务执行串行化,最大限度的限制死锁发生

标签:事务,name,temp,处理,死锁,MySQL,超时,id
From: https://www.cnblogs.com/dbasql/p/18679779

相关文章

  • Mysql 5.7解决windows本地无法开启服务-1067
    出现原因:我切换mysql8服务后,切换回去mysq5.7,然后报下面的问题。删除后应该可以 但是可能因为我有两个服务,一个5.7,一个8.0然后我继续报错:D:\Monkey\mysql-5.7.33-winx64\bin>netstartMySQL57mysql57服务正在启动.mysql57服务无法启动。服务没有报告任何错误。......
  • 1.MySql基础架构之SQL语句的执行
    1.MySQL数据库的整体架构(i)连接器:连接器负责与客户端建立连接,获取权限、维持和管理连接。连接命令中的mysql是客户端工具,用来建立服务端连接。在完成经典的TCP握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。​ 如果用户名密码认证通过,连接器会到权限......
  • MySQL数据库笔记——主从复制
    大家好,这里是GoodNote,关注公主号:Goodnote,本文详细介绍MySQL的主从复制,从原理到配置再到同步过程。文章目录简介核心组件主从复制的原理作用主从复制的线程模型主从复制的模式形式复制的方式设计复制机制主从复制的配置步骤优化和改进总结历史文章简介MySQ......
  • MySQL 创建数据库问题:You have an error in your SQL syntax(MySQL 数据库命名规则问题
    问题描述与处理策略1、问题描述CREATEDATABASEmy-shop-db;执行上述SQL语句,报如下错误CREATEDATABASEmy-shop-db>1064-YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtouse......
  • ingress-nginx代理tcp使其能外部访问mysql
    一、helm部署mysql主从复制helmrepoaddbitnamihttps://charts.bitnami.com/bitnamihelmrepoupdate helmpullbitnami/mysql 解压后编辑values.yaml文件,修改如下(storageclass已设置默认类)117##@paramarchitectureMySQLarchitecture(`standalone`or`re......
  • MySQL数据库基本操作命令
    数据库基本操作数据库可以看作是一个专门存储数据对象的容器,每一个数据库都有唯一的名称,并且数据库名称都是有实际意义的,这样就可以清晰的看出每一个数据库用来存放什么数据。在MySQL数据库中存在系统数据库和自定义数据库,系统数据库是安装在MySQL后系统自带的数据库,自定义......
  • 费马定理以及逆元预处理
    #include<bits/stdc++.h>usingnamespacestd;staticconstintMOD=1000000007;//预先全局存放阶乘与逆阶乘的数组staticconstintMAXN=100000;//根据题意,n最多10^5longlongfact[MAXN+1],invFact[MAXN+1];//快速幂,用于求x^y%MODlonglongfastPow(lo......
  • MySQL——DQL基本查询 聚合函数 分组查询 排序查询 分页查询
    1.3DQL语法DQL:数据查询语言,用来查询数据库表中的记录。DQL基本查询1.查询多个字段select字段1,字段2,字段3...from表名;案例查询指定字段nameworknoageselectname,workno,agefromemp;2.查询所有字段select*from表名;select*fromemp;3.设置别名select字段1a......
  • To 遗留类 和 From 遗留类 与 传统日期处理的转换(配有详细案例代码解析)
    前言:小编最近又要练科目三了天天好多事情啊,不知道大家放了假事情多不多我们继续日更!!!我们一直都是以这样的形式,让新手小白轻松理解复杂晦涩的概念,把Java代码拆解的清清楚楚,每一步都知道他是怎么来的,为什么用这串代码关键字,对比同类型的代码,让大家真正看完以后融会贯通......
  • 如何在仿真分析,预测中 应用风力发电、光伏发电数据、用电负荷数据集,构建一个全面的时
    风力发电、光伏发电数据、用电负荷数据集,用于仿真分析,预测等。[1]光伏数据,光伏出力年光伏数据集,包含光伏发电功率、多种类型光照辐射强度数据(DNI,DHI,GHI),附带多种数据,可用于光伏场景生成与缩减、光伏特性分析、光伏优化调度等。[2]光伏预测功率数据2007-2020光伏预测功......