mysql数据库死锁的产生原因及解决办法

2023-11-10

这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下
 

数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。

死锁的第一种情况

一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

解决方法:

这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进 行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。

死锁的第二种情况

用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。这种死锁比较隐蔽,但在稍大点的项 目中经常发生。如在某项目中,页面上的按钮点击后,没有使按钮立刻失效,使得用户会多次快速点击同一按钮,这样同一段代码对数据库同一条记录进行多次操 作,很容易就出现这种死锁的情况。

解决方法:

1、对于按钮等控件,点击后使其立刻失效,不让用户重复点击,避免对同时对同一条记录操作。
2、使用乐观锁进行控制。乐观锁大多是基于数据版本(Version)记录机制实现。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是 通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数 据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。乐观锁机制避免了长事务中的数据 库加锁开销(用户A和用户B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。Hibernate 在其数据访问引擎中内置了乐观锁实现。需要注意的是,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户更新操作不受我们系统的控制,因此可能会造 成脏数据被更新到数据库中。
3、使用悲观锁进行控制。悲观锁大多数情况下依靠数据库的锁机制实现,如Oracle的Select … for update语句,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。如一个金融系统, 当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户账户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读 出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对成百上千个并发,这 样的情况将导致灾难性的后果。所以,采用悲观锁进行控制时一定要考虑清楚。

死锁的第三种情况

如果在事务中执行了一条不满足条件的update语句,则执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。类似的情 况还有当表中的数据量非常庞大而索引建的过少或不合适的时候,使得经常发生全表扫描,最终应用系统会越来越慢,最终发生阻塞或死锁。

解决方法:

SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,建立相应的索引进行优化。
5.小结
总体上来说,产生内存溢出与锁表都是由于代码写的不好造成的,因此提高代码的质量是最根本的解决办法。有的人认为先把功能实现,有BUG时再在测试阶段进 行修正,这种想法是错误的。正如一件产品的质量是在生产制造的过程中决定的,而不是质量检测时决定的,软件的质量在设计与编码阶段就已经决定了,测试只是 对软件质量的一个验证,因为测试不可能找出软件中所有的BUG。

【原文】http://www.jb51.net/article/78089.htm



https://www.cnblogs.com/sivkun/p/7518540.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql数据库死锁的产生原因及解决办法 的相关文章

  • 如何获取knex / mysql中所有更新记录的列表

    这是我正在处理的查询 return knex table returning id where boolean false andWhere fooID foo id update boolean true limit num then f
  • 合并两个具有相同列名称的 MYSQL 表

    我有两张桌子 表一是计划时间 id edition time 1 1 9 23am 2 2 10 23am 表二为实际时间 id edition time 1 1 10 23am 2 2 11 23am 我想要的结果是 Caption Ed
  • 如何编写可以补偿拼写错误数据的 MySQL 搜索?

    有没有什么方法可以编写一个 MySQL 搜索来弥补用户在拼写等方面的错误 作为随机示例 有人可能会输入 电子邮件受保护 cdn cgi l email protection代替 电子邮件受保护 cdn cgi l email protect
  • 如何比较行内的重叠值?

    我似乎对这个 SQL 查询有问题 SELECT FROM appts WHERE timeStart gt timeStart AND timeEnd lt timeEnd AND dayappt boatdate 时间格式为军用时间 物流
  • 打印表数据mysql php

    我在尝试打印表格的一些数据时遇到问题 我是 php mysql 的新手 但我认为我的代码是正确的 这里是 h1 Lista de usu rios h1
  • MySQL LIKE %string% 不够宽容。我还有什么可以用的吗?

    我有一位客户询问他们的搜索是否可以搜索公司名称 这些名称可以根据用户输入以多种格式进行搜索 例如数据库中存储的公司是 A J R Kelly Ltd 如果用户搜索 一个 J R Kelly 被发现 使用
  • MySQL 字符串中的第二个(或第三个)索引

    查找字符串中第三个空格的索引的最简单方法是什么 我的目标是得到CCC在此空格分隔的列表之外 AAAA BBBB CCCC DDDD EEE 其中A B和D是固定长度 C是可变长度 E F G是可选的 在Java中 我会使用indexof 起
  • 是否可以将新表和旧表从触发器传递到 MySQL 中的过程中?

    是否可以将新表和旧表从触发器传递到 MySQL 中的过程中 我怀疑不会 因为没有过程接受的表这样的数据类型 有什么可能的解决方法吗 理想情况下它看起来像这样 CREATE TRIGGER Product log AFTER UPDATE O
  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • 何时在 mysql 中使用 Union [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于 Union 您会在什么现实情况下使用它 因为对我来说 对具有不同列用途 含义的两个表中的两个选择查询使用联合是没有意义的 例如
  • 无法连接到 Node.js 上的 MySQL 数据库

    我仍然不明白为什么在尝试连接到 Node js 上的 MYSQL Server 时仍然收到此错误消息 ERROR Error ER ACCESS DENIED ERROR Access denied for user root localh
  • 如何导出带有数据的 MySQL 架构?

    我有一个完整的架构 其中有许多表 其中包含 MySQL 查询浏览器中的数据 现在我想将这个包含所有表 数据的完整数据库发送给我的同事 我怎样才能将其发送给我的同事 以便他可以将这个完整的架构放入他的 MySQL 查询浏览器中 Thanks
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • MySQL 数据库无法在 XAMPP for Mac 上启动

    突然我在 mac 上遇到了这个问题 我无法启动我的 MySQL 数据库 我只能启动 ProFTPD 和 Apache Web Server 这是应用程序日志 Starting all servers Starting MySQL Datab
  • 日期时间与时间戳字段

    我是 MySQL 数据库的新手 您是否建议在表创建中使用日期时间或时间戳字段以及原因 我正在使用 MySQL 5 7 和 innodb 引擎 Thanks 我会用TIMESTAMP对于任何需要自动管理的事情 因为它支持诸如ON UPDATE
  • MySQL 将表从 Latin1 转换为 utf8

    我需要将包含大量数据的表从 Latin1 转换为 utf8 以便它可以接受韩语字符 如何更改该表而不损坏其中的数据 我的 SQL 语句是什么 最好的方法是什么 ALTER TABLE database name table name CON
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • 如何为我的整个 Node.js 应用程序使用相同的 MySQL 连接?

    我有一个app js 我从那里运行我的整个应用程序 在 app js 内部 我require许多文件中都有代码 对于每个文件 我都这样做 var mysql require mysql var mclient mysql createCon
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不

随机推荐

  • python手机端下载-Python3,x:如何进行手机APP的数据爬取

    Python3 x 如何进行手机APP的数据爬取 一 简介 平时我们的爬虫多是针对网页的 但是随着手机端APP应用数量的增多 相应的爬取需求也就越来越多 因此手机端APP的数据爬取对于一名爬虫工程师来说是一项必备的技能 我们知道 网页爬取的
  • SQLI-LABS Less-17

    Update 数据库更新注入 具体情况 具体分析 函数 check input 对 uname 进行检查 从 uname 处是无法注入了 而对 passwd 进行了更新 可以利用这个 updata 进行注入 注意 这里必须的 uname 必
  • 因为计算机中丢失VCRUNTIME140怎么办?为什么会丢失VCRUNTIME140.dll

    vcruntime140 dll是一个Windows动态链接库 其主要功能是为C C 编译的程序提供运行时支持 这个库在Microsoft Visual Studio 2015中被引入 其名称中的 140 代表版本号 在我们打开运行软件或者
  • MySQL的索引类型和实现原理

    一 按表列属性分类 1 单列索引 以表的单个列字段创建的索引 2 联合索引 以表的多个列字段组合创建的索引 在查询条件使用索引的从左字段顺序才会生效 遵循最左匹配原则 单列索引和联合索引又包括 普通索引 非主键 非唯一列的索引 主键索引 基
  • 计蒜客T1115——字符串判等

    水题不解释 考研复习压力偶尔写一道换换心情还不错 这里有一个比较有趣的知识点 对于同时输入多个字符串时还要允许空格的输入 那么普通的cin函数就不能满足要求了 这里采用getline函数解决 如下 string s1 s2 getline
  • Docker基本命令使用——(1)

    Docker常用命令 docker images 列出本地主机上的镜像 a 列出本地所有的镜像 含中间映像层 q 只显示镜像ID digests 显示镜像的摘要信息 no trunc 显示完整的镜像信息 docker search xxx
  • 3000帧动画图解MySQL为什么需要binlog、redo log和undo log

    全文建立在MySQL的存储引擎为InnoDB的基础上 先看一条SQL如何入库的 这是一条很简单的更新SQL 从MySQL服务端接收到SQL到落盘 先后经过了MySQL Server层和InnoDB存储引擎 Server层就像一个产品经理 分
  • produces在@requestMapping中的使用方式和作用

    转载自 https blog csdn net jaryle article details 72965885 produces可能不算一个注解 因为什么呢 它是注解 requestMapping注解里面的属性项 它的作用是指定返回值类型
  • 1787.使所有区间的异或结果为零

    题意 给你一个整数数组 nums 和一个整数 k 区间 left right left lt right 的 异或结果 是对下标位于 left 和 right 包括 left 和 right 之间所有元素进行 XOR 运算的结果 nums
  • ROS 仿真

    欢迎访问我的博客首页 ROS仿真 1 依赖与官方包 参考 1 依赖与官方包 我们需要一些 ROS 官方给出的包 可以使用 apt 命令安装 也可以下载源码编译 编译这些包需要用到的依赖及其安装方法是 sudo apt get install
  • 记一次线程爆满导致服务器崩溃的问题排查

    记一次线程爆满导致服务器崩溃的问题排查 1 重启服务器 2 修改最大线程数 3 查找线程最大的java程序 4 导出问题程序的线程日志 5 找到问题代码 6 解决方案 问题介绍 测试服务器突然无法连接 ssh登录不上 只有重启才能解决 重启
  • Redis第七讲 Redis存储模型详解

    Redis存储模型 每次在Redis数据库中创建一个键值对时 至少会创建两个对象 一个是键对象 一个是值对象 而Redis中的每个对象都是由 redisObject 结构来表示 redisObject的结构与对象类型 内存编码 内存回收 共
  • SDA、SFDA、CFDA改名为NMPA

    再见CFDA 国家药监局英文简称改为NMPA 通知公告 1 新成立的国家药品监督管理局 是否还监管食品 答 国家药品监督管理局作为新组建的政府部门 隶属于新成立的国家市场监督管理总局 相比较原来的国家食品药品监督管理总局 国家药品监督管理局
  • JavaScript与生俱来的特性---异步与回调

    线程是建立在进程的基础上的一次程序运行单位 一个进程中可以有多个线程 js单线程就意味着 所有任务需要排队 前一个任务结束 才会执行后一个任务 如果前一个任务耗时很长 后一个任务就不得不一直等着 如果是因为计算量大 CPU忙不过来 倒也合乎
  • 使用VLC开源库开发播放器

    使用VLC开发播放器 分为如下几步 1 下载VLC开源库 下载VLC开源库 可在官网上下载 地址如下 http download videolan org pub videolan vlc 可以在该网站下载想要的版本 32位或64位 Rel
  • npm&yarn使用

    一 npm与yarn介绍 NPM Node Package Manager 作为Node js的依赖包管理器便应运而生 而YARN则是针对NPM的一些不太优秀的地方设计开发的 NPM无需单独安装 安装完Node js即自带NPM 若想安装y
  • MFC(VS2010)编程实例之一(Edit Control控件)

    Edit Control是在MFC对话框中最频繁的使用的控件之一 获取Edit Control的值与赋值是常见的操作 Edit Control对应的MFC类为CEdit类 而CEdit是继承自CWnd类的 所以也继承了来自CWnd类的Get
  • elasticsearch中index.highlight.max_analyzed_offset设置

    elasticsearch中设置index highlight max analyzed offset Caused by java lang IllegalArgumentException The length of message f
  • Dynamics CRM2016详细安装教程-3(Dynamics CRM安装)

    1 以具有管理员级别特权的用户身份登录到将安装 Microsoft Dynamics CRM Server 2016 的域 并且该用户是本地计算机上 Administrators 组的成员 不能以受信任域中成员的身份安装此应用程序 2 双击
  • mysql数据库死锁的产生原因及解决办法

    这篇文章主要介绍了mysql数据库锁的产生原因及解决办法 需要的朋友可以参考下 数据库和操作系统一样 是一个多用户使用的共享资源 当多个用户并发地存取数据 时 在数据库中就会产生多个事务同时存取同一数据的情况 若对并发操作不加控制就可能会读