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>