mysql四种隔离级别-测试

本文详细介绍了MySQL的四种事务隔离级别:读未提交、读提交、可重复读和串行化。通过实例演示了不同隔离级别下事务之间的数据可见性,展示了脏读、不可重复读和幻读等现象,并强调了可重复读隔离级别下事务的一致性。最后,讨论了串行化如何确保数据安全但可能引入的阻塞问题。
摘要由CSDN通过智能技术生成

说明以下文章为转载,原文如下

https://blog.csdn.net/uuqaz/article/details/123772584

MySQL的四种隔离级别 - COYG - 博客园

主要是可重复读到测试,参考以上文档

大概为

事物A 读1 读2(前提两次查询在一个事物中)

事物B 修改

当事物B修改操作,位于事物A两次读之间,且事物B修改事物已提交,可重复读可保证 两次读取结果一致。着重说下,下面测试第6点,当事物A事物提交,即上一个事物结束,再次读取时,读到的结果是事物B修改后的值。

前言:

mysql 事务有四种隔离级别,分别是:读未提交READ UNCOMMITTED 、读提交 READ COMMITTED、可重复读REPEATABLE READ、串行化SERIALIZABLE。下面我们分别看下不同隔离级别下对事务的影响。

首先查看mysql的隔离级别: show variables like 'transaction_isolation';

我们看到mysql的默认隔离级别是可重复读,下面设置mysql的隔离级别为读未提交。这里我们只设置当前会话的隔离级别:set session transaction isolation level READ UNCOMMITTED; 然后我们在数据库中建立这样一张表 staffs:

CREATE TABLE `staffs` (
  `id` int DEFAULT NULL,
  `name` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  KEY `id_name_age_index` (`id`,`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
然后预置一部分数据:

读未提交
接下来我们进行一个操作,来演示读未提交的隔离级别。

BEGIN;
select * from staffs where id =1;
 得到如下结果:

 事务B执行:

BEGIN;
select * from staffs where id =1;
update staffs set age=11 where id=1;
事务B 执行完update操作后,在事务A中,再查询下id=1的值,如下所示:

 可以看到,此时事务A已经读到了事务B的修改,注意此时事务B尚未提交commit。 这个也就是我们所说的脏读。

读已提交
接下来演示下读提交,修改当前会话的隔离级别为READ COMMITTED读提交 set session transaction isolation level READ COMMITTED;

 然后按照上面的顺序执行:

发现,在读提交的隔离级别下,当事务B修改完数据尚未提交时,事务A是无法读取到修改的数据的。当事务B提交事务后,事务A才可以看到修改的结果。

可重复读
修改当前会话的隔离级别为可重复读: set session transaction isolation level REPEATABLE READ; 还按照上面的事务执行顺序执行:

可以发现,当事务B提交后,事务A查询的结果依然是事务A开启时读到的数据,这就是所谓的可重复读,也就是说事务开启时读到的数据,在事务提交前,是一致的,不会因为外面事务的修改提交而改变开启事务前读到的值。

串行化
设置数据库的隔离级别为SERIALIZABLE,然后按照图下的步骤执行操作

当事务A 查询id为1的数据行后,事务B尝试去update id=1的数据行,就会被阻塞住。只有当事务Acommit 后,事务B才执行成功(可以看到步骤2执行了22秒)。当事务A再进行查询ID=1的数据时,发现age还是13,而事务B查询已经变成了14.这是因为事务B还没有提交,对于串行化,对于同一行数据,必须一个事务一个事务顺序执行,当事务B提交后,事务A再查询,就变成了14.

 更多java高级学习课程资料,java课件,源码,安装包等小编已经整理打包好!有兴趣想要学习的小伙伴点赞私信回复学习即可免费领取!


————————————————
版权声明:本文为CSDN博主「十一技术斩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/uuqaz/article/details/123772584

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值