何为脏读、不可重复读、幻读
2.0 前言
如上图开启两个会话来模拟两个线程同时去访问数据库表table中id=1的记录,假设两个会话开启前数据库中table表中id=1的记录行里面的列age值为5。会话1和2一开始都开启了显示的事务(只有执行commit命令才会提交数据的修改),会话2首先更新了table中id=1的记录行的age列的值为10(更新前值为5),在会话2执行commit提交前,会话1通过select语句查询id=1的记录行中age列的值,这时候如果存在脏读,则会话1读取到的age的值是10而不是5了,虽然会话2的更新还没有提交。那么脏读存在什么问题那?如果会话2最后提交了,那么会话1虽然在会话2还没提交就读取到了修改的值,但是也没什么影响;但是如果会话1读取到会话2没有提交的数据后,会话2执行了rollback,也就是没有把修改刷新到数据库,但是会话1已经使用了修改的数据,这就出现了错误。
如上图假设数据库表table里面id=1的记录行中age列一开始值为5,然后会话1和会话2分别开启了一个事务,会话1首先查询id=1的记录中age字段值为5,然后会话2修改id=1的记录中age的值为10然后提交了事务,然后会话1再次搜出id=1的记录中age的值,如果出现了不可重复读,则这时候搜出来的age的值为10而不是5。需要注意的是会话1两次查询是在同一个事务内进行的,期间事务并没有提交。不可重复读的存在显得不是那么不可容忍,毕竟读取的是已经提交了的数据。
领取专属 10元无门槛券
私享最新 技术干货