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

一、什么是死锁

加锁(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日 15:59

相关推荐

  • 教你备案云虚拟主机租用能干什么。

    备案云虚拟主机租用的主要目的是为了提高网站的稳定性、安全性以及符合法律法规要求,备案后的网站可以更好地保护知识产权,便于推广和营销。 备案云虚拟主机租用可以用于搭建个人或企业的网站、博客、论坛等互联网…

    2024年7月17日
    01
  • 聊聊动态虚拟主机租用怎么配置。

    动态虚拟主机租用的配置主要涉及到几个关键步骤。需要选择租用方式,常见的是“包年/包月”购买。对于服务器的选择,一般默认使用通用型S6系列云服务器,也可能随机分配到其他可用区,并配备默认的安全组和弹性公网IP…

    2024年7月14日
    04
  • MySQL大表优化方案之引擎优化

    引擎 目前广泛使用的是MyISAM和InnoDB两种引擎: MyISAM MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是: 不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁 不支持事务 不支持外键 不支…

    2018年3月10日
    0215
  • PHP与数据库日志管理的集成

    随着互联网技术的发展,越来越多的网站或应用程序需要在后台对数据库进行管理和维护。而在这个过程中,如何记录和分析日志是非常重要的一环。PHP作为最流行的Web开发语言之一,在日志记录方面也拥有着强大的功能。…

    2023年5月19日
    06
  • 我来分享香港服务器空间租用如何维护。

    香港服务器空间租用维护需要注意以下几点: ,- 选择合适的机房和服务商,确保机房设备完善、售后服务好。,- 定期备份数据,防止数据丢失。,- 监控服务器性能,及时发现潜在问题并采取相应措施。,- 定期清理服务…

    2024年7月10日
    04
  • 小编分享如何在 Windows 上快速查看 MongoDB 数据库的方法。

    MongoDB简介 MongoDB 是一个开源的 NoSQL 数据库,属于文档型数据库,它以键值对(key-value)的形式存储数据,具有高性能、高可用性、易扩展等特点,在 Windows 系统上,我们可以使用 MongoDB Compass 或者命令行工…

    2024年7月3日
    01
  • 我来教你phporm。

    PHP ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,它允许开发者用面向对象的方式操作数据库,通过使用 PHP ORM,开发者可以避免直接编写 SQL 语句,从而提高代码的可读性和可维护性,在本文中,我们…

    2024年6月20日
    03
  • 教你5步教你怎样使用宝塔面板搭建小程序。

    宝塔面板搭建小程序教程:1.安装宝塔;2.创建网站并绑定域名;3.下载并上传小程序代码;4.配置数据库;5.申请微信开发者工具。 宝塔面板是一款简单易用的服务器管理工具,它可以帮助用户轻松搭建和管理网站、数据库…

    2024年7月9日
    07

联系我们

QQ:951076433

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