首页 > 数据库 >MYSQL 删除数据是非多,8.030 还是有死锁

MYSQL 删除数据是非多,8.030 还是有死锁

时间:2023-06-22 12:07:23浏览次数:37  
标签:name 8.030 死锁 MYSQL test 操作 into delete


MYSQL  删除数据是非多,8.030 还是有死锁_java

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。

我这个人说问题愿意是感性+理性,首先需要感性认知,我们先来看一个下面的问题,在说这个问题之前,我们先将一些问题说明。

1 数据库版本 8.030 官方版本,社区版本

2  数据库的ISOLATION是 RC 

3  数据量不大,就是几条数据进行测试而已

4  这个问题,至少在8.030 以及以下版本都存在这个问题

表一张,数据少许无特殊

create table delete_test (id int not null auto_increment,
                          name varchar(20),
  comment varchar(200),
  primary key pk_id (id));
insert into delete_test (name) values ('11');
insert into delete_test (name) values ('11');
insert into delete_test (name) values ('22');
insert into delete_test (name) values ('22');
insert into delete_test (name) values ('33');
insert into delete_test (name) values ('33');
insert into delete_test (name) values ('44');
insert into delete_test (name) values ('44');
insert into delete_test (name) values ('55');

MYSQL  删除数据是非多,8.030 还是有死锁_数据库_02

下面开始进行找事的操作

Session A

MYSQL  删除数据是非多,8.030 还是有死锁_java_03

Session B

MYSQL  删除数据是非多,8.030 还是有死锁_数据库_04

死锁信息

MYSQL  删除数据是非多,8.030 还是有死锁_mybatis_05

MYSQL  删除数据是非多,8.030 还是有死锁_nosql_06

问题 1,为什么我看上去根本就不搭的两个删除的操作,死锁了,我删除的数据的主键不一样,删除的值不一样,定位的删除记录也不一样,怎么就死锁了?

SESSION 1 delete from delete_test where name = '22' and id < 5;

SESSION 2 delete from delete_test where name = '33' and id < 6;

我们从实际的锁信息中,可以看到第一次的删除的操作的确是锁住 3 ,4  行的数据,而第二次应该去锁定第5行的数据,最终没有,锁定的3行的数据,导致锁的X锁冲突。

问题  2  我将两个操作的顺序颠倒,是否能解决死锁的问题

SESSION 1 delete from delete_test where name = '33' and id < 6;

SESSION 2 delete from delete_test where name = '22' and id < 5;

MYSQL  删除数据是非多,8.030 还是有死锁_nosql_07

MYSQL  删除数据是非多,8.030 还是有死锁_数据库_08

结果还是一样的,还是死锁了从结果看,我们锁在 5 

为什么因为删除会导致锁扩大,我们将操作变化为UPDATE 的操作看看结果如何

MYSQL  删除数据是非多,8.030 还是有死锁_数据库_09

MYSQL  删除数据是非多,8.030 还是有死锁_nosql_10

MYSQL  删除数据是非多,8.030 还是有死锁_mybatis_11

答案很明显,同样的语句更换为UPDATE  后,数据将不会在产生死锁,从此我们可以得出一个结论,DELETE 与UPDATE 操作同样的数据,最终的结果是DELETE 会产生死锁,UPDATE 不会。

为什么会这样,我已经使用了RC ,而不是RR, 为什么还会导致这样的问题,首先即使是RC ,在每个数据库的操作中都会产生SNAPSHOT,而在这个事务的生命周期中,在进行插入和删除要满足一个条件,就是在一个事务的操作的记录范围内,与另一个事务的操作的范围内,不能有重合,这里不是指的实际的范围,而是你条件的范围。这里MYSQL的设计中的思想是,对所有有可能产生变化的记录全部要加锁,包含不存在的KEY,一般来说如果设计中通过条件来判断操作的范围即可,如我们上面的操作中,一个只要锁3,4 记录即可,另一个只要锁 5好记录即可,但是这使我们人类的想法,而到了数据库中,条件的范围是需要判断的,而且COST 很大,你不知道一个条件的COST 是大是小,所以基于MYSQL的B+TREE 的方式中,无论你DELETE 的操作使用什么隔离级别(RN除外),你都会导致一个key range locking 的锁,保护你操作的区间的记录不被 INSERT 或 DELETE 操作后变化产生的不可预知的数据逻辑错误的问题。

所以我们上面的操作是告知开发一个在使用MYSQL 中重要的问题,不要对数据库进行DELETE操作,这里指的是你的应用程序。应用程序将DELETE 操作更换为,UPDATE 的操作,因为UPDATE 的操作本身并不会引起记录的缺少或增多。这里我们不谈你更新主键的问题,因为从业务或数据库的角度来说,我们都不建议你一个开发去更新主键,这在MYSQL中是一个最大的忌讳。

当然如果想监控到特别详细的锁信息,如果你在show egine innodb status; 中没有发现记录,那么是你下面的这两个部分没有开。

SET GLOBAL innodb_status_output=ON;

SET GLOBAL innodb_status_output_locks=ON;

MYSQL  删除数据是非多,8.030 还是有死锁_数据库_12

MYSQL  删除数据是非多,8.030 还是有死锁_数据库_13

标签:name,8.030,死锁,MYSQL,test,操作,into,delete
From: https://blog.51cto.com/u_14150796/6534540

相关文章

  • Polardb 如何替换MYSQL 之 IMCI 列式(1)建立一个列式引擎
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。讲了那么多期,都是在力量上进行论述,本期开始进入到正式的POALRDB的内部操作中,POLARDB与MYSQL在登录中最大的不同是,你可以通过代......
  • Polardb 如何替换MYSQL 之 IMCI 列式攻略
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。MYSQL是ORACLE后面经常被提到要替换的数据库,MYSQL为什么要被替换,嗯这点是一言难尽,但是可以说明的是,替换MYSQL的数据库类型还......
  • MYSQL 5.7 升级 8.0 后的 由于字符集导致的大问题 ?
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。MYSQL8.0已经很多年了,但是,但是,但是,还有很多公司和业务项目在MYSQL5.6,5.7上继续奋斗,这还不是一个重要的问题,重要的问题是早期......
  • POSTGRESQL 和 MYSQL 到底应该不应该控制活跃连接
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近群里某个同学的提问,引起的本篇文章,关于数据库连接的部分,没有废话,我们先针对MYSQL来说说数据库连接的部分。首先MYSQL的客......
  • 我也不知道该怎么回答这个问题,还学MYSQL 吗?
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题最近一个同学偶然问了我一个这样的问题,实话说我不知道该怎么回答这个问题。但我知道问这个问题的同学,他思考了,不是在追风,一会儿MYSQ......
  • MYSQL collation 选好还能换吗
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。Collation 主要的作用是什么,排序。 数据库中的字符众多,而在这里很多的查询中都对这些符号进行一些比对的工作,如A=a,B>B......
  • MySQL
    初识MySQLJavaEE:企业级Java开发、Web前端(页面:展示——数据);后端(连接点:连接数据库JDBC,连接前端——控制视图跳转和给前端传递数据);数据库(存数据,Txt,Excel,world)。程序员等级:只会写代码,没学好数据库,基本混饭吃。操作系统,数据结构预算法!当一个不错的程序员!离散数学、数字电路......
  • MySQL 视图&存储过程&函数
    1视图1.1视图的作用当我们创建一张表的视图后,可以用和表差不多的使用方式来使用视图,比如可以对视图进行select查询操作、过滤或者排序数据等等。同时,也可以联结其它视图或者表,甚至可以添加和更新数据(但一般不会这么做,而且存在诸多限制)。总结起来,视图有以下优点:重用SQL语句,简......
  • LoadRunner通过SiteScope监控MySQL的性能
    步骤:安装SiteScope下载Java版的MySQL驱动,下载地址:http://www.mysql.com/downloads/connector/j/下载成功后,把解压缩的mysql-connector-java-5.1.14-bin.jar文件放入:C:\SiteScope\java\lib\ext 以及 C:\SiteScope\java64\lib\ext目录下。重启系统.进入SiteSc......
  • MySQL约束
    1约束1.1约束分类NOTNULL:非空,用于保证该字段的值不能为空。比如姓名、学号等。DEFAULT:默认,用于保证该字段有默认值,比如性别。PRIMARYKEY:主键,用于保证该字段的值具有唯一性,并且非空。比如学号、员工编号等。UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空。比如座位号。......