文章首发于我的个人博客,到个人博客体验更佳阅读哦

https://www.itqiankun.com/article/1564901308

脏读

举例演示脏读

脏读就是B事务读取到了A事务尚未提交的数据 ,什么意思呢,往下看
首先执行下面的sql语句

drop table acount;
create table acount(
id int,
name varchar(225),
money int
);
insert into acount values(1,'tom',2500);
insert into acount values(3,'lucy',3500);


因为是要看脏读,所以我把隔离级别设置成read uncommitted,而且是给两个客户端都设置成这样,比如下面的结果

set session transaction isolation level read uncommitted;

然后两个客户端都查询一个数据

select * from acount;

此时可以看到数据是一样的

然后两个客户端都开启事务

start transaction;

然后我在左边这个客户端,tom给lucy转钱1000,所以需要下面两个update语句,此时我还没有commit;

update acount set money=money-1000 where name='tom';
update acount set money=money+1000 where name='lucy';

此时结果如下所示,此时我在右边的这个客户端,查询表里面还有多少钱,却发现右边客户端的事务也可以查询到lucy的钱增加了1000,变成了4500,这个就是脏读,右边客户端的事务读取了左边客户端事务还没有提交的数据.

这样就会造成一个问题,如果此时tom给lucy打电话,告诉他我给你转过钱了,然后lucy也查询钱数,发现确实钱已经到了(因为lucy查询的数据此时lucy就是4500,所以lucy说好),但是此时如果我左边客户端在rollback;一下,这样左边的lucy的钱就会变成3500,而右边的客户端的lucy钱也会变成3500,这样lucy的钱还是3500,这样的话,lucy就会亏了,因为lucy实际上没有收到这1000元。

解决上面的脏读

怎么解决脏读呢,如果我把隔离等级设置成read committed,就会避免上面的结果
执行下面的结果

drop table acount;
create table acount(
id int,
name varchar(225),
money int
);
insert into acount values(1,'tom',2500);
insert into acount values(3,'lucy',3500);

然后此时左边和右边客户端的数据是一样的

因为是解决脏读,所以我把隔离级别设置成read uncommitted,而且是给两个客户端都设置成这样,比如下面的结果

set session transaction isolation level read committed;

两个客户端都查询一个数据

select * from acount;

两个客户端都要开启事务

start transaction;


然后我在左边这个客户端,tom给lucy转钱1000,所以需要下面两个update语句,此时我还没有commit;

update acount set money=money-1000 where name='tom';
update acount set money=money+1000 where name='lucy';

然后我在右边的这个客户端,查询表里面还有多少钱,发现右边客户端的事务也可以查询到lucy的钱还是3500,这个就是避免了脏读,

不可重复读

一个事务中两次读取的数据的内容不一致就叫做不可重复读

举例演示不可重复读

数据如下

drop table acount;
create table acount(
id int,
name varchar(225),
money int
);
insert into acount values(1,'tom',2500);
insert into acount values(3,'lucy',3500);


因为是要看不可重复,所以需要把隔离级别设置成read committed,而且是给两个客户端都设置成这样,比如下面的结果

set session transaction isolation level read committed;


两个客户端都查询一个数据

select * from acount;


两个客户端都要开启事务

start transaction;


然后我在左边这个客户端,tom给lucy转钱1000,所以需要下面两个update语句,此时我还没有commit;

update acount set money=money-1000 where name='tom';
update acount set money=money+1000 where name='lucy';


然后我分别查询左边和右边里面的account,然后发现左边客户端的lucy的钱变成了4500,然后右边客户端的事务查询到lucy的钱还是3500,

然后我把左边客户端commit提交之后,但是此时右边客户端的事务还没有提交,可是此时右边客户端的lucy钱变成了4500元,这就是不可重复读,因为右边客户端在一个事务中两次读取的数据的内容不一致

commit;

怎么解决不可重复读呢

数据如下

drop table acount;
create table acount(
id int,
name varchar(225),
money int
);
insert into acount values(1,'tom',2500);
insert into acount values(3,'lucy',3500);


因为是要解决不可重复,所以我把隔离级别设置成repeatable read,而且是给两个客户端都设置成这样,比如下面的结果

set session transaction isolation level repeatable read;


两个客户端都查询一个数据

select * from acount;

两个客户端都要开启事务

start transaction;

然后我在左边这个客户端,tom给lucy转钱1000,所以需要下面两个update语句,此时我右边客户端还没有commit;

update acount set money=money-1000 where name='tom';
update acount set money=money+1000 where name='lucy';

然后我右边的这个客户端,查询表里面还有多少钱,发现右边客户端的事务也可以查询到lucy的钱还是3500,

然后我把左边客户端commit提交之后,但是此时右边客户端的事务还没有提交, 此时查询左边客户端lucy的钱变成了4500元,右边客户端的lucy钱还是3500元,这就是避免了不可重复读

commit;

幻读/虚读

一个事务中两次读取的数据的数量不一致

幻读/虚读和不可重复读比较类似,所以看懂不可重复读,这个也就懂了

能看到这里的同学,就帮忙右上角点个赞吧,Thanks♪(・ω・)ノ

原文链接

大佬链接
https://www.itqiankun.com/article/1564901308

事务里面的脏读、不可重复读、虚读/幻读相关推荐

  1. 可重复读如何解决幻读

    学习之前的疑问: 可重复读的概念 与 不可重复读的概念 行锁+gap锁(间隙锁) 快照读 与 当前读区别 快照读中的MVCC 当前读中的gap锁 和 行锁 前几天面试时被问到了mysql可重复读如何解 ...

  2. mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解

    一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...

  3. MySQL可重复读应用场景_mysql-repeatable read 可重复读隔离级别-幻读实例场景

    本文详解 repeatable read 可重复读 隔离级别产生的影响(幻读) -- SERIALIZABLE serializable 序列化 :一个个事务排成序列的形式.事务一个挨一个执行,等待前 ...

  4. java禁止数据库写入事务_Java -- JDBC 事务处理, 事务的隔离级别 脏读 不可重复读 等......

    1. 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 数据库开启事务命令 •start transaction开启事务 •Rollback 回滚事务 •Commit 提 ...

  5. oracle 脏读,脏读 不可重复读 幻读

    序言 脏读.不可重复读.幻读这几个概念开始接触和学习的时候是在大学学习数据库系统的时候,那时候对这几个专业名词的理解停留在概念文字上,并没有真正使用过实践中,最近工作中涉及到这几个概念方面的知识,就来 ...

  6. mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...

    MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...

  7. 脏读,不可重复读,幻读区别

    脏读 脏读又称无效数据读出.一个事务读取另外一个事务还没有提交的数据叫脏读. 例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Roll ...

  8. 脏读,不可重复读,幻读区别和避免

    在了解脏读,不可重复度,幻读之前,首先要明白这三种情况的出现都是和数据库并发事务有关联的,如果所有的读写都按照队列的形式进行,就不会出现问题. 名词解析和解决方案 脏读 脏读又称无效数据读出(读出了脏 ...

  9. mysql 可重复读 更新覆盖_Mysql事务隔离级别之可重复读

    Mysql事务隔离级别之.可重复读(REPEATABLE-READ) 查看mysql 事务隔离级别 mysql> SELECT @@tx_isolation; +---------------- ...

  10. 揭秘Mysql事务隔离级别之可重复读

    揭秘Mysql事务隔离级别之可重复读 1.可重复读的来源 2.何为不可重复读 3.那么可重复读和不可重复读究竟有什么关系呢? 4.模拟不同事务隔离级别对不可重复的处理情况(有线程执行顺序). 4.1. ...

最新文章

  1. Codeforces 894.D Ralph And His Tour in Binary Country
  2. 分享一些好用的 Chrome 插件!
  3. Hadoop的分布式文件系统
  4. python读写kafka集群(转载+自己验证)
  5. 输入序列不连续的序列检测
  6. mysql 性能问题_mysql性能问题
  7. mysql怎样查表的模式_mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】...
  8. 神奇的applycall
  9. java+测试ip是否通_java 批量测试主机能否ping通
  10. MTK 驱动---(13)DCT工具使用介绍
  11. Java获取泛型类的实际类型的实例
  12. java编程新手初学者入门学习,看什么书比较好
  13. 提升PPT逼格的利器!只需1招,让PPT页面化腐朽为神奇~
  14. win2008服务器系统玩红警,win8系统电脑下不能兼容红警2游戏的解决方法【图文】...
  15. iPhone的指纹识别与面部识别(FaceID)
  16. js语言扩展之trim
  17. 线性代数笔记(1):向量空间与子空间
  18. 滴水逆向4月16日学习
  19. 基于OpenCvSharp的数字图像处理 - 图像彩色类型转换
  20. 网易服务器修改权限等级,网易七鱼客服管理_七鱼客服管理人员权限设置_企业服务汇...

热门文章

  1. 计算机英语900句小e,计算机英语100句
  2. 虎牙不想做一家游戏直播公司
  3. netty-socketio+spring boot 长链接 实时通信 消息推送
  4. kubernetes 的 滚动升级和回滚(rollout)
  5. 知识图谱概论(二):概念具象化描述
  6. 不用第三方写一个简单的推流软件
  7. 正则表达式测试工具使用说明
  8. 台式台式计算机型号怎么看,台式电脑主板型号在哪里看
  9. netty报错:LEAK: ByteBuf.release() was not called before it‘s garbage-collected
  10. comet 简单了解