Mysql事务隔离级别之读提交详解
程序员文章站
2022-05-12 11:52:08
查看mysql 事务隔离级别
mysql> show variables like '%isolation%';
+---------------+---...
查看mysql 事务隔离级别
mysql> show variables like '%isolation%'; +---------------+----------------+ | variable_name | value | +---------------+----------------+ | tx_isolation | read-committed | +---------------+----------------+ 1 row in set (0.00 sec)
可以看到当前的事务隔离级别为 read-committed 读提交
下面看看当前隔离级别下的事务隔离详情,开启两个查询终端a、b。
下面有一个order表,初始数据如下
mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 13 | 1 | +----+--------+ 1 row in set (0.00 sec)
第一步,在a,b中都开启事务
mysql> start transaction; query ok, 0 rows affected (0.00 sec)
第二步查询两个终端中的number值
a
mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 13 | 1 | +----+--------+ 1 row in set (0.00 sec)
b
mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 13 | 1 | +----+--------+ 1 row in set (0.00 sec)
第三步将b中的number修改为2,但不提交事务
mysql> update `order` set number=2; query ok, 1 row affected (0.00 sec) rows matched: 1 changed: 1 warnings: 0
第四步查询a中的值
mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 13 | 1 | +----+--------+ 1 row in set (0.00 sec)
发现a中的值并没有修改。
第五步,提交事务b,再次查询a中的值
b
mysql> commit; query ok, 0 rows affected (0.01 sec)
a
mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 13 | 2 | +----+--------+ 1 row in set (0.00 sec)
发现a中的值已经更改
第六步,提交a中的事务,再次查询a,b的值。
a
mysql> commit; query ok, 0 rows affected (0.00 sec) mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 13 | 2 | +----+--------+ 1 row in set (0.00 sec)
b
mysql> select * from `order`; +----+--------+ | id | number | +----+--------+ | 13 | 2 | +----+--------+ 1 row in set (0.00 sec)
发现a,b中的值都更改为2了。
下面给一个简单的示意图
我们可以看到,在事务隔离级别为读已提交 的情况下,当b中事务提交了之后,即使a未提交也可以读到b事务提交的结果。这样解决了脏读的问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Docker容器和本机之间的文件传输方法