没有事务会发生的情况:
1.脏读
脏读就是指当事务A对数据进行了修改,而这种修改还没有提交到数据库中,
这时,另外一个事务B也访问这个数据,然后使用了这个数据,
此时事务A进行回滚操作那这条数据就会有问题。
这就是脏读。
2.不可重复读
不可重复读是指在事务A内,读取了一个数据,事务A还没有结束时,
这是事务B也访问了这个数据,修改了这个数据,并提交。
紧接着,事务A又读这个数据。由于事务B的修改,那么事务A两次读到的的数据可能是不一样的,因此称为是不可重复读。
(经典案例,先检查余额后扣款)
3.幻读
所谓幻读,指的是当事务A在读取某个范围内的记录时,
此时事务B又在该范围内插入了新的记录,
当之前的事务A再次读取该范围的记录时,会产生幻行。
这就是幻读。
幻读和不可重复读的区别就是:不可重复读是读到了其他事务修改的数据(行级锁解决),幻读是读到了其他事务新增的数据(表级锁解决)
事务隔离级别以及处理的问题
1.读未提交
可以读到其他事务未提交的数据,什么情况都处理不了。
2.读提交
只能读到其他事务已经提交的事务(使用快照读解决,读快照版本),能避免脏读,但是无法避免不可重复读和幻读(oracle默认事务级别)
3.可重复读
为了处理不可重复读而存在,实质上也是快照读,但是在事务开启的时候不允许其他事务对数据进行修改(update操作)(mysql的Innodb默认事务级别),
能避免脏读和不可重复读,但是不能避免幻读
4.串行化
面面俱到,事务“串行化顺序执行”,也就是一个一个排队执行。
能避免上述所有情况,但是效率较差,除特殊情况外一般使用可重复读事务级别