【数据库】脏读、幻读、不可重复读

脏读

        是指当前一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库,这时,另外一个事务也访问这个数据,然后使用了这个数据

例如:

        张三的工资为5000,事务A把他的工资改为8000,但事务A还没有提交

        同时,事务B正在读取张三的工资,读取到张三的工资为8000

        随后,事务A发生一场,发生了事务回滚,张三的工资又回滚成了5000

        最后,事务B读取到的张三的工资为8000,8000就是一个脏数据,事务B进行了一次脏读

也就是说,先读一个被修改的数据,结果这个数据没有被修改成功,但是获得的还是修改后的数据

幻读

        是指事务不是独立执行时发生的一种现象,例如第一个事务对表中的数据进行了修改,这种修改涉及到表中的全部数据行,同时,第二个事务也修改这个这个数据,这个修改是想表中插入了一行数据,那么第一个事务发现表中还没有修改的数据行

        当前工资为5000的员工有10人,A事务将所有工资为5000的人的工资修改为8000

        这时,事务B插入一条工资也为5000的记录

        最后,事务A修改完后,查询工资为5000的员工,发现还有一人,此时产生了幻读

也就是说,先修改全部条件相同的数据,事务还没有结束的时候又添加了一个相同条件的数据,导致修改后还有这种条件的数据

不可重复读

        指在同一个事务,多次读同一个数据,在这个事务还没有结束的时候,另外一个事务也访问同一数据,那么,在第一个事务中两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一致的,这就导致一个事务内两次读到的数据是不一样的

例如

        在事务A中读到张三的工资为5000,操作还没有完成,事务还没有提交

        同时,事务B把张三的工资改为8000,并提交了事务。

        随后在事务A中,在此读取张三的工资,此时工资变成8000,一个事务中前后两次读取的结果并不一致,导致了不可重复读

或者

        程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现有两条记录,共花了1.2万元,似乎出现了幻觉,这就是幻读。

也就是说,在一个事务两次读取之间,数据被修改了,导致两次读取的数据不相同

幻读和不可重复读的区别在于

        幻读侧重增删

        不可重复读侧重修改

总结

脏读就是读到了没有提交的数据

不可重复读就是两次读同一条数据的数据不同

幻读就是在范围读取的时候读到新增和删除的数据,导致两次读到的总数据不同

参考文章

MySQL事务之幻读问题_小异常的博客-CSDN博客_事务幻读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值