数据库之事务级别

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

3.可重复读
    为了处理不可重复读而存在,实质上也是快照读,但是在事务开启的时候不允许其他事务对数据进行修改(update操作)(mysql的Innodb默认事务级别),
    能避免脏读和不可重复读,但是不能避免幻读
    
4.串行化
    面面俱到,事务“串行化顺序执行”,也就是一个一个排队执行。
    能避免上述所有情况,但是效率较差,除特殊情况外一般使用可重复读事务级别

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章