MYSQL的多事物产生的问题,脏读,幻读,不可重复读,其中幻读和不可重复读我不是很理解,不可重复读为:事务B读取了两次数据资源,在这两次读取的过程中事务A修改了数据,导致事务B在这两次读取出来的数据不一致。
这种在同一个事务中,前后两次读取的数据不一致的现象就是不可重复读,修改完数据就是读取的数据不一致啊,前一次读id=1的数据然后将id=1的数据修改,第二次再读肯定不一样,我不理解这个不可重复读。幻读:事务B前后两次读取同一个范围的数据,在事务B两次读取的过程中事务A新增了数据,导致事务B后一次读取到前一次查询没有看到的行。幻读和不可重复读有些类似,但是幻读强调的是集合的增减,而不是单条数据的更新。跟不可重复读一样,对一类数据新增或者修改,数据的条数肯定增加这不是对的吗,这不是正常的吗为什么说与问题?

MYSQl的脏读、幻读、不可重复读
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- 饼子会飞 2023-08-29 14:52关注
回答来自Calude:
对于不可重复读,需要注意是在同一个事务内进行了两次读取,而两次读取的数据结果不一致。如果是不同事务,数据变化也是正常的。例如:
事务A 开始
事务A 第一次读取id=1的数据,name=张三
事务B 开始,更新id=1的数据,将name改为李四
事务A 第二次读取id=1的数据,name=李四
事务A结束
在事务A一个过程中,读取同一数据两次发生了变化,这就是不可重复读。
对于幻读,其关键在于一个范围内的数据集发生了变化:
事务A 开始
事务A 第一次查询id在1-5之间的数据,共5条
事务B 插入一条id=6的数据
事务A 第二次查询id在1-5之间的数据,共6条
事务A 结束
同一个范围内,事务B的插入操作导致事务A的两次查询结果集大小发生了变化,这就是幻读。
不可重复读和幻读都违反了事务的隔离性原则,可能读取到脏数据,所以要通过设置合理的隔离级别来避免。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报