脏读,幻读,不可重复读,以及两类数据丢失更新
脏读:是指一个事务读取到了另一事务未提交的数据,造成select前后数据不一致
如上图所示,事务A讲原来数据库里面的X值由1更新为2,这时事务B开始读取数据库数据,读到的是修改后的数据X为2,这时事务A不提交了,
数据进行回滚,X又回到了原来的值了,这个时候就发生了脏读。现象就是数据库明明是1,而读到的却是2.
幻读:指select时不存在某记录,但准备插入时发现此记录已存在,无法插入
如上图所示,事务A和事务B,对数据库进行操作,事务A先查了一条数据,发现是空的,于是就准备把这条数据插进去,与此同时,正好事务B插入了一条数据,导致事务A查询的数据不为空了
,A事务进行插入数据时,发现有了相同的数据了,插入不了,就好像出现幻觉一样,刚才明明没有值的,这就是幻读
幻读和脏读的区别就是幻读是读的已经提交的事务,而脏读读的是未提交的事务
不可重复读:一个事务读取到了另一事务已提交的数据,造成select前后数据不一致
如上图所示,事务B第一次读X是1,后来事务B更新X为2,并且提交了,后来事务B又读了一次读的是X为2,前后读的数据不一致,这就是不可重复读
第一类数据丢失更新:
如图所示,事务A将X改为2,此时事务B把X修改为3,事务B提交了,这个时候事务A进行回滚了,结果X又变成原来的1了,
导致事务B的更新丢失了
第二类数据丢失更新:
如图所示:事务A讲X由1改成2,提交事务结束了,这个时候事务B还在操作,事务B又把X改成了3,提交事务,最后事务A的更新就丢失了
备注:不同事务同时进行数据库操作,可能由于进程,cpu等其他情况,就会出现先后顺序了,后续在写针对上面几种情况的解决方法