Mysql模拟事物的隔离级别【脏读、不可重复读、幻读】

12 篇文章 0 订阅

一、简介

未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。

提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。

可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读。

串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

1.1 汇总

在这里插入图片描述

二、模拟

2.1 环境

mysql数据库
创建两个session,会话,用来演示两个事务的并发访问,查看事务的隔离情况。
A-session
B-session
在这里插入图片描述

三、操作

3.1 脏读【READ UNCOMMITTED】

1.先在A-session中查询账户的情况。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT * FROM t_account;

账户余额为9000
2.然后在B-session中修改账户数据,但是不提交事务

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
START TRANSACTION;

UPDATE t_account SET amount = 7000 WHERE id = 1;

SELECT * FROM t_account;

账户余额变为7000.
3.回滚事务B-session

ROLLBACKSELECT * FROM t_account;

4.Asession查询就会变为9000,此时产生了脏读。

3.2 提升事务隔离级别【READ COMMITTED】

此时就会轻松的解决A-session脏数据问题,查询的数据为9000。
但是在B-session中还是脏数据为7000.
此时提交事务COMMIT;
此时A B 全会变为7000.
问题:不可以重复读,一个7000,一个9000

3.3 可重复度【REPEATABLE READ】

此时解决以上的问题。
脏读不会发生,commit之后,可重复度不会发生。 两个会话仍然查询结构是不一样的。
问题:模拟幻读情况
1.B-session中插入一条数据

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
START TRANSACTION;

insert into t_account(id,user_id,amount) value(4,4,9000);
commit;

SELECT * FROM t_account;

2.A-session查询数据,此时查不到B已经插入的数据,产生了幻读。
问题:幻读,插入数据后,两个会话读取到的内容不一样。

3.4 可串行不做演示,隔离界别最高,牺牲了并发性。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding路人王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值