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

一、什么是死锁

加锁(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

相关推荐

  • 小编教你plsql如何批量导出表结构。

    您可以使用PL/SQL工具批量导出表结构。具体步骤如下:,,1. 打开PL/SQL客户端,点击“工具”–>点击“导出用户对象”。,2. 选择“current user”后,会显示当前登录用户对应表空间的表名称、序列名称和存储过程…

    2024年7月17日
    01
  • 说说谷歌云免费一年后怎么收费。

    谷歌云免费一年:让您的业务更上一层楼 随着互联网的快速发展,企业对于数据存储和处理的需求越来越高,为了满足这一需求,谷歌云推出了一项令人兴奋的优惠活动:免费使用谷歌云服务一年!本文将详细介绍如何充分利…

    2024年6月20日
    04
  • 什么是数据库连接池?

    在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java程序则要把代表连接的java.sql.C…

    2023年5月13日
    05
  • asp虚拟主机管理的方法有哪些。

    ASP虚拟主机的管理方法主要包括利用控制面板、FTP、数据库管理工具和文件管理器等工具进行操作。控制面板是最常使用的方式,可以方便地进行各种网站设置的管理;FTP和API则适合有一定技术水平的用户和开发者,便于…

    2024年7月14日
    01
  • 我来分享sql网页版。

    SQL网页管理器是一种用于管理数据库的工具,它可以帮助用户轻松地创建、修改和删除数据库中的数据,通过使用SQL网页管理器,用户可以更加高效地进行数据库操作,提高工作效率,下面将详细介绍如何使用SQL网页管理器…

    2024年6月28日
    03
  • 我来教你深入浅出Oracle中的物理表。

    Oracle中的物理表是指存储在磁盘上的数据库对象,由数据块组成,包含行和列,用于持久化存储数据。物理表结构由段、区、盘区构成,支持索引以加速查询。 深入浅出Oracle中的物理表 在Oracle数据库中,物理表是存储…

    2024年6月26日
    01
  • 数据库的库操作

    库:存储数据的仓库--起名称 表:存储数据的表,一个库可以创建多个表--起名称 字段:给表中的数据起名称 记录:具体一条数据 1.创建数据库 语句:create database 数据库名 库选项; 库选项:字符集、校对集 2.查询…

    2017年11月21日 MySQL自学教程
    0180
  • 重蔚自留地php学习第三十九天——关于mysql事物触发器函数过程的总结

    数据备份 对数据表内容进行备份 备份:select [*/字段列表] into outfile 文件路径 [字段处理] [行处理] from 表 还原:load data infile 文件路径 into 表 [字段处理] [行处理] 备份 ---------------》 数据库 -&g…

    2018年10月26日
    0242

联系我们

QQ:951076433

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