首页 > 数据库 >MySQL 死锁

MySQL 死锁

时间:2025-01-12 10:12:17浏览次数: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/shujuyr/p/18666697

相关文章

  • MySQL sleep 线程过多怎么解决
    1知道sleep线程过多原因首先要知道到底是什么原因导致的sleep线程过多的:程序逻辑问题,导致连接一直不释放;mysql参数的问题,是不是参数配置的不合理,一直不释放连接;mysql语句的问题,数据库查询不够优化,过度耗时。大并发情况问题,导致sleep情况过多;2临时解决s......
  • MySQL主从同步不一致解决办法
    一般主从同步错误首先要考虑是不是在从库中误操作导致的。结果发现,有人在从库中进行了一条针对有主键表的sql语句的插入,导致主库再插入相同sql的时候,主从状态出现异常。发生主键冲突的报错。解决方法:在确保主从数据一致性的前提下,可以在从库进行错误跳过。像从库如果不提供......
  • MySQL数据库出现乱码怎么解决
    为什么我的数据库总会出现中文乱码的情况。一堆中文乱码不知道怎么回事?当向数据库中写入创建表,并插入中文时,会出现这种问题。此报错会涉及数据库字符集的问题。.1解决乱码的几个方面对于中文乱码的情况,从三个方面数据终端:就是我们连接数据库的工具设置为utf8操作系统层面:l......
  • MySQL can't opet file(errno:24)
    有的时候,数据库跑得好好的,突然报不能打开数据库文件的错误了。解决思路:首先我们要先查看数据库的errorlog。然后判断是表损坏,还是权限问题。还有可能磁盘空间不足导致的不能正常访问表,操作系统的限制也要关注下,相关应用限制也要关注下;123#ulimit-n查看系统的......
  • MySQL 中删除重复数据 SQL 写法
    要在MySQL中删除重复的数据并只保留一条,可以使用下面的方法(要用的时候直接复制小改下条件和表名称即即可)方法一:使用leftjoin+子查询删除重复数据(推荐)温馨提示:本人在500w数据下执行此SQL耗费15s-30s左右使用leftjoin(推荐方法删除重复数据,添加唯一组......
  • MySQL练习2
    1.单表查询(1)素材表名:worker--表中字段均为中文,比如“部门号,工资,职工号,参加工作”等(2)创建worker表CREATETABLEworker (部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政......
  • Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引
    索引是数据库中用于加速查询操作的重要机制。通过索引,MySQL可以快速定位到满足查询条件的数据行,而不需要扫描整个表。合理的索引设计可以显著提高查询性能,但不合理的索引可能会导致性能下降和磁盘空间浪费。因此,理解索引的工作原理、类型以及如何优化索引非常重要。一、索......
  • 【MySQL】常用的内置函数
    文章目录1.日期函数2.字符串函数3.数学函数4.其它函数在MySQL内部,有很多的函数供我们使用1.日期函数获取时间与日期current_date()current_time()current_timestamp()now()date()获取当前的日期时间仅获取当前的日期/时间获取一个时间加/减一个......
  • MySQL如何对用户资源进行限制
    MySQL提供了对每个用户的资源限制管理MAX_QUERIES_PER_HOUR: 一个用户在一个小时内可以执行查询的次数(基本包含所有语句)MAX_UPDATES_PER_HOUR:一个用户在一个小时内可以执行修改的次数(仅包含修改数据库或表的语句)MAX_CONNECTIONS_PER_HOUR:允许用户每小时连接的次数MAX_U......
  • MySQL主要的SQL_Mode值详解
    ANSI更改语法和行为,使其更符合标准SQL。STRICT_TRANS_TABLESTRADITIONAL使MySQL的行为象“传统”SQL数据库系统。该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”等同STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE......