脏读、幻读、不可重复读和事务的隔离级别

1.脏读

就是事务A对数据进行增删改查,但是未提交,此时另一个事务读到了未提交的数据。如果此时事务A进行了回滚,则事务B读取的数据即为脏数据

例子:

 update account set money=money+100 where name=’B’; (此时A通知B)
  update account set money=money - 100 where name=’A’;
当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

2.不可重复读

这是发生在同一个事务中的事情,事务A首先读取到数据,然后事务B对数据库进行可修改(进行了数据的修改),并且提交了事务,然后事务A为了对读取值进行检验再次读取了该数据,读出了不一样的数据就发生了不可重复读问题。(事务A在此过程中并没有提交)

3.幻读

所谓幻读就是同一个事务中两次读取返回的结果集不一样(这里跟不可重复读的不同在于幻读读取的是增加或者减少了行记录)

事务A第一次读取到了N行数据,第二次读取到了N+1行数据,原因是事务B在两次读取的过程中间对数据进行了修改,增加了一行数据。

另一个说法(一个意思):

第一个事务A对一定范围的数据进行批量修改,第二个事务B在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。

例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

 

 

事务的隔离级别:

Read UnCommitted(读未提交)     最低的隔离级别

Read Commited (读提交)   只避免了脏读       大部分数据库采用的默认隔离级别

Repeatable Read(重复读)  避免了脏读和重复读     mysql的默认级别

Serializable(序列化)   最高隔离级别 导致并发度下降,性能最差

脏读、幻读、不可重复读和事务的隔离级别