MySQL 死锁后事务无法回滚是真的吗?


开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1200人左右 1 + 2 + 3)新人会进入3群

MySQL 作为目前互联网企业使用最多的,或者说在基于成本下,最流行的数据库之一,MySQL 在国内使用者众多,那么在MySQL偶然安装后,在使用中出现死锁后,死锁中的事务到底能不能回滚 ?我们来进行相关的实验

我们先验证一遍

1 我们打开一个MySQL 版本为 8.027 官方版本

2 通过下面的操作我们可以确认两个分屏访问的是同一个MySQL的数据库

3 我们在其中建立一张表,并且插入数据

4  我们通过数据库的操作原理,产生了一个死锁条件,让下面的操作产生了死锁,并让数据通过自身的工作原理,解开了死锁。

5  然后我们对相关的表进行数据查询,看最终我们的数据表产生了什么最终的结果

6  我们再次验证,MySQL 数据库的隔离级别,我们并未选择MySQL的默认隔离级别 Repeatable Read ,而是我们大多数数据库包含Oracle 常用的 read committed

好了现在我们来捋一捋结果,到底是不是如PostgreSQL 老师们Diss ,MySQL 存在死锁时,部分提交的问题,并且违反了事务的ACID的特性。

我们先把A 面的操作都用文本列出来

mysql> select version();<br>+-----------+<br>| version() |<br>+-----------+<br>| 8.0.27    |<br>+-----------+<br>1 row in set (0.00 sec)<br><br>mysql> use test;<br>Database changed<br>mysql> show tables;<br>+----------------+<br>| Tables_in_test |<br>+----------------+<br>| orders         |<br>| payments       |<br>| test_deadlock  |<br>+----------------+<br>3 rows in set (0.00 sec)<br><br>mysql> drop table test_deadlock;<br>Query OK, 0 rows affected (0.04 sec)<br><br>mysql> create table test_deadlock (id int primary key,name varchar(255));<br>Query OK, 0 rows affected (0.02 sec)<br><br>mysql> insert into test_deadlock (id,name) values (1,'a');<br>Query OK, 1 row affected (0.01 sec)<br><br>mysql> insert into test_deadlock (id,name) values (2,'b');<br>Query OK, 1 row affected (0.00 sec)<br><br>mysql> select * from test_deadlock;<br>+----+------+<br>| id | name |<br>+----+------+<br>|  1 | a    |<br>|  2 | b    |<br>+----+------+<br>2 rows in set (0.00 sec)<br><br>mysql> begin;<br>Query OK, 0 rows affected (0.00 sec)<br><br>mysql> insert into test_deadlock(id,name) values (3,'c');<br>Query OK, 1 row affected (0.01 sec)<br><br>mysql> update test_deadlock set name = 'd' where id = 1;<br>Query OK, 1 row affected (0.01 sec)<br>Rows matched: 1  Changed: 1  Warnings: 0<br><br>mysql> update test_deadlock set name = 'd' where id = 1;<br>Query OK, 0 rows affected (0.00 sec)<br>Rows matched: 1  Changed: 0  Warnings: 0<br><br>mysql> update test_deadlock set name = 'd' where id = 2;<br>ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction<br>mysql> commit;<br>Query OK, 0 rows affected (0.01 sec)<br><br>mysql> select * from test_deadlock;<br>+----+------+<br>| id | name |<br>+----+------+<br>|  1 | d    |<br>|  2 | e    |<br>|  3 | c    |<br>+----+------+<br>3 rows in set (0.00 sec)<br><br>mysql> show variables like '%isolation%';<br>+-----------------------+----------------+<br>| Variable_name         | Value          |<br>+-----------------------+----------------+<br>| transaction_isolation | READ-COMMITTED |<br>+-----------------------+----------------+<br><br><br>