首页数据库mysql脏读、幻读、不可重复读(mysql脏读幻读不可重复读 怎么解决)

mysql脏读、幻读、不可重复读(mysql脏读幻读不可重复读 怎么解决)

时间2023-03-24 17:33:22发布访客分类数据库浏览1176
导读:脏读:有个英雄表如下图所示第一天 小张 往里面插入数据:BEGIN; INSERT INTO heros_temp values(4, '吕布' ;小张还没有提交事务的时候,小李对数据表进行了访问,小张看到的结果如下小李读到了小张还没有提交...

脏读:

有个英雄表如下图所示

第一天 小张 往里面插入数据:

BEGIN;
    
INSERT INTO heros_temp values(4, '吕布');
    

小张还没有提交事务的时候,小李对数据表进行了访问,小张看到的结果如下

小李读到了小张还没有提交的数据,我们称之为“脏读”

不可重复读

小张想查看 id=1 的英雄是谁,于是他进行了 SQL 查询:

SELECT name FROM heros_temp WHERE id = 1;
    

然而此时,小李开始了一个事务操作,他对 id=1 的英雄姓名进行了修改,把原来的“张飞”改成了“张翼德”:

BEGIN;
    
UPDATE heros_temp SET name = '张翼德' WHERE id = 1;
    

然后小张再一次进行查询,同样也是查看 id=1 的英雄是谁:

运行结果:

这个时候你会发现,两次查询的结果并不一样。小张会想这是怎么回事呢?他明明刚执行了一次查询,马上又进行了一次查询,结果两次的查询结果不同。实际上小张遇到的情况我们称之为“不可重复读”,也就是同一条记录,两次读取的结果不同。

幻读

小张想要看下数据表里都有哪些英雄

这时当小张执行完之后,小李又开始了一个事务,往数据库里插入一个新的英雄“吕布”

BEGIN;
    
INSERT INTO heros_temp values(4, '吕布');
    

小张这时忘记了英雄都有哪些,又重新执行了一遍查询:

他发现这一次查询多了一个英雄,原来只有 3 个,现在变成了 4 个。这种异常情况我们称之为“幻读”。

总结

  1. 脏读:读到了其他事务还没有提交的数据。
  2. 不可重复读:对某数据进行读取,发现两次读取的结果不同,也就是说没有读到相同的内容。这是因为有其他事务对这个数据同时进行了修改或删除。
  3. 幻读:事务 A 根据条件查询得到了 N 条数据,但此时事务 B 更改或者增加了 M 条符合事务 A 查询条件的数据,这样当事务 A 再次进行查询的时候发现会有 N+M 条数据,产生了幻读。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

数据库javaphp

若转载请注明出处: mysql脏读、幻读、不可重复读(mysql脏读幻读不可重复读 怎么解决)
本文地址: https://pptw.com/jishu/321.html
Argo CD 2.4 已发布,带来重大变化!! 软件测试最常用的 SQL 命令(二) | 高级 Join 多表查询

游客 回复需填写必要信息