看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁

加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获得写锁(排他锁)。当两个事务互相之间需要等待对方释放获得的资源时,如果系统不进行干预则会一直等待下去,也就是进入了死锁(deadlock)状态。

二、死锁产生的场景

1.数据库表准备

1.1. 创建数据库表

#创建数据库create database chuanzhi;#选择数据库use chuanzhi;#创建测试表CREATE TABLE `tb_heima` (  `id` INT NOT NULL,  `username` VARCHAR(45) NULL,  PRIMARY KEY (`id`));#插入测试数据INSERT INTO `tb_heima` (`id`, `username`) VALUES ('1', '传智教育-教育行业A股IPO第一股');

2.死锁场景演示

2.1. 打开一个dos窗口

mysql -u账号 -p密码,进入mysql命令行输入:

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

开启一个事务,mysql> begin;

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

执行更新语句,mysql> update tb_heima set username = 'heima' where id =1;

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

注意:此时更新是成功的,但并未提交事务。

2.2.再打开一个dos窗口

登录mysql,开启另一个事务操作同上。再次执行更新语句,mysql> update tb_heima set username = 'heima' where id =1;

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

注意:此时第二个窗口处于等待中,需要等待第一个窗口释放写锁才能执行成功。

等待一段时候后,第二个窗口报错了

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

注意:由于第一个窗口未提交事务,导致第二个窗口在等待一段时候后,超过锁定等待超时。

三、解决死锁问题

通过mysql客户端工具连接,按照以下步骤执行。

select * from information_schema.innodb_lock_waits; #锁等待的信息,可以看到堵塞和被堵塞者

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

注意:超过锁定等待超时后,此条记录会消失,也就是说正在阻塞的记录在此表才能查看到。

select * from information_schema.innodb_trx; # 查询锁事务状态信息

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

注意:查询出死锁后,得到trx_mysql_thread_id死锁的id。

kill sessionId; # 杀掉有问题的session

kill 15;kill 16;

再次执行select * from information_schema.innodb_trx; # 查询锁事务状态信息

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

注意:确认此表是否存在锁事务记录,如果没有则说明死锁问题已经解决。

四、如何避免死锁

对于数据库的多表操作时,尽量按照相同的顺序进行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。所有的update和delete操作必须走唯一索引SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,建立相应的索引进行优化。把SELECT放在Update语句前避免事务中的用户等待交互

文章来源于:王晴儿网页设计博客 欢迎分享交流,转载请注明出处

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/262674.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年5月10日 11:56
下一篇 2023年5月11日

相关推荐

  • 聊聊延迟低的vps。

    “提供低延迟的VPS服务,确保数据快速传输和高效处理。” 在当今的互联网时代,VPS(Virtual Private Server,虚拟专用服务器)已经成为了许多网站和应用程序的首选托管方式,随着网络应用的复杂性和用户…

    2024年7月23日
    00
  • PHP与数据库异步处理的集成。

    随着互联网技术的不断发展,Web应用程序已经成为互联网世界中最重要的组成部分之一。而PHP作为Web开发的一种开源脚本语言,其在Web应用程序开发中日益重要。在大多数Web应用程序中,数据处理是一个必不可少的环节。…

    2023年5月21日
    06
  • 我来教你织梦数据库配置文件。

    如何修改织梦企业后台联系方式 如果是织梦cms在后台设置的只能是网站名字,也就是品牌词,在系统设置里有。然后需要到对应模板修改,当然,一般人是不会去修改的,我是说如果你想要自己的网站基础优化好一点的话,…

    2024年6月28日
    00
  • 关于html文件如何储存到数据库里面。

    HTML文件本身并不能直接存储到数据库中,因为HTML是一种标记语言,用于描述网页的结构和内容,你可以将HTML文件的内容提取出来,然后存储到数据库中,这个过程通常涉及到以下几个步骤: (图片来源网络,侵删) 1、…

    2024年6月25日
    00
  • 重蔚自留地php学习第三十九天——mysql事物触发器函数过程

    数据备份 将数据里的数据进行保存到外部文件,从而在数据库内部数据丢失或者出错的情况下能够通过备份文件进行还原操作,从而将损失降低到最小。 对单表内的纯数据进行备份 将表中的数据(不包含结构,没有字段头信…

    2018年10月23日 MySQL自学教程
    0267
  • 通过php操作mysql来创建数据库(附代码)

    创建数据库 此操作页面的html代码如下: 添加数据库 数据库名 操作 php07 修改 删除 这时我们需要建立一个用户提交数据库名的表单的htnl页面 代码如下: 标题 数据库名: 最后是一个接收用户提交数据并处理的页面 p…

    2018年3月14日
    0251
  • 我来教你vps网站搭建的步骤是什么。

    VPS网站搭建的步骤大致如下:选择合适的VPS计划,购买VPS服务器,登录服务器安装宝塔面板,宝塔面板环境搭建及站点设置,搭建Typecho环境,开启CDN防护。 VPS网站搭建的步骤如下: 1、选择合适的VPS服务商 你需要选…

    2024年7月17日
    00
  • 经验分享dedecms不更新了。

    Dedecms停止更新,可能对使用该内容管理系统的网站产生影响。 DedeCMS是一款非常流行的开源内容管理系统,它以其简单易用、功能丰富而受到广大站长的喜爱,在使用过程中,有些站长可能会遇到后台更新缓慢甚至卡死的…

    2024年7月7日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息