初识脏读、不可重复读、幻读

I . 脏读:一个事务读到另一个事务未提交的数据,导致多次查询的结果不一致;

以转账为例 ,mysql数据库的默认隔离级别为 repeatable read,此隔离级别可以避免脏读和不可重复读,为了演示产生脏读,

开启两个A、B两个窗口,进行A事务和B事务。

1.在A 窗口中将隔离级别设置为 red uncommited ,  B窗口不变,默认为repeatable read;

2.假设张三有 100块   李四也有100块,同时在A、B窗口中开启事务,在B窗口中进行转账事务,张三转给李四50块,在B事务提交前,张三通知李四查账,此时李四在A事务中查到的结果是150;此时B事务未提交,却已经在另一个A事务中读到了数据,如在B事务提交前发生了异常,B事务进行了回滚(roolback),李四再去查,发现咋变成100了,两次(多次)查询的结果不一致,就这样产生了脏读大致过程如下图


初识脏读、不可重复读、幻读


II 不可重复读 :一个事务读到另一个事务已提交的 update(主要是修改)的数据,导致多次查询的结果不一致

同样以转账为例 ,为了演示产生产生不可重复读

开启两个A、B两个窗口,进行A事务和B事务。

1.在A 窗口中将隔离级别设置为 red commited ,  B窗口不变,默认为repeatable read;

2.假设张三有 100块   李四也有100块,同时在A、B窗口中开启事务,在B窗口中进行转账事务,张三转给李四50块,在B事务提交前,张三通知李四查账,此时李四在A事务中查到的结果是100,没收到钱;此时B事务未提交,A事务中没有读到B事务未提交的数据,避免了脏读。然后提交事务,李四再去查,发现变成150了,读到了另一个事务已提交的数据两次(多次)查询的结果不一致,就这样产生了不可重复读读大致过程如下图


初识脏读、不可重复读、幻读


III 幻读:一个事务读到另一个事务已提交的 insert into(添加到数据库)的数据,导致多次查询的结果不一致

~~~以上为个人理解,不妥之处,希望得到指正