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

一、什么是死锁

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

相关推荐

  • 聊聊动态虚拟主机租用怎么配置。

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

    2024年7月14日
    00
  • 今日分享vps内网服务器搭建的方法是什么意思。

    VPS内网服务器搭建涉及使用虚拟专用服务器(VPS)技术,将一台物理服务器分割成多个虚拟专享服务器。每个VPS都可分配独立的公网IP地址、操作系统、超大空间、内存、CPU资源、执行程序和系统配置等。具体搭建步骤包…

    2024年7月14日
    00
  • 我来说说免费mysql数据库空间怎么申请的。

    您可以从以下网站申请免费的MySQL数据库空间:SQLPub、db4free.net、wsfdb.cn、memfire。这些网站提供了不同数量和大小的存储空间,以及不同的限制和要求。请注意,这些服务可能不适用于生产环境,仅供测试和学习使…

    2024年7月9日
    00
  • 小编分享sqldeveloper怎么删除表数据。

    您好,您可以使用以下步骤在SQL Developer中删除表数据:,,1. 打开SQL Developer并连接到数据库。,2. 在SQL Worksheet中输入以下查询语句: DELETE FROM 表名 WHERE 条件;,3. 点击“运行”按钮,即可删除符合条…

    2024年7月26日
    00
  • 关于自建服务器可以用来干什么。

    自建服务器可以用来干什么 随着互联网的普及和发展,越来越多的企业和个人开始关注到服务器的重要性,服务器作为网络的核心设备,承担着存储、处理和传输数据的重要任务,自建服务器可以用来干什么呢?本文将从以下…

    2024年7月6日
    00
  • wind数据库怎么打开。

    数据库的开通和使用是一个相对复杂的过程,需要一定的技术知识和操作经验,下面将详细介绍如何开通数据库以及如何使用Wind数据库。 一、数据库的开通 1. 选择合适的数据库类型:根据需求和预算,选择适合的数据库类…

    2024年6月29日
    00
  • asp虚拟主机管理的方法有哪些。

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

    2024年7月14日
    00
  • 今日分享mysql删除库。

    MySQL删除库的方法有很多,这里我们介绍两种常见的方法:使用DROP DATABASE语句和使用mysqladmin命令。 一、使用DROP DATABASE语句 1. 语法 DROP DATABASE database_name; 2. 示例 假设我们要删除一个名为`testdb`…

    2024年6月18日
    00

联系我们

QQ:951076433

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