初识脏读、不可重复读、幻读
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(添加到数据库)的数据,导致多次查询的结果不一致
~~~以上为个人理解,不妥之处,希望得到指正