(1)前序
    不可重复读:就是一个事务多次查询一条数据,结果每次读到的值都不一样,这个过程中可能别的事务会修改这条数据的值,而且修改数值之后事务都提交了,结果导致每次查到的值都不一样,都查到了提交事务修改的值。
    脏写:就是两个事务都没提交,都修改同一条数据,结果一个事务回滚了,把另外一个事务修改的值也给撤销了,所谓脏写就是两个事务没提交状态下修改同一个值。
    脏读:就是一个事务修改了一条数据的值,结果还没提交,被另一个事务查到了,结果修改数据的事务回滚了,另一事务再次读,就读不到了,也就是另一事务读到了一个事务修改但还没提交的值,这就是脏读。

    (2)幻读
    幻读指的是一个事务用一样的SQL多次查询,结果每次查询都会发现查到了一些之前没看到过的数据。
    简单来说,你一个事务A,先发送一条SQL语句,里面有一个条件,要查询一批数据出来,比如“select from table where id>10”,类似这种SQL
    然后呢,他一开始查询出来了10条数据,接着这个时候,别的事务B往表里插入了几条数据,而且事务B还提交了,此时多了几行数据出来。
    接着事务A此时再次查询,再次按照之前的一模一样的条件执行“select
    from table where id>10”这条SQL语句,由于其他事务插入了几条数据,导致这次他查询出来了12条数据。
    46.jpg47.jpg

    (3)总结
    脏读,脏写,不可重复读,幻读 都是业务系统会多线程并发执行,每个线程都会开启一个事务,每个事务都会执行增删改查操作。然后数据库并发执行多个事务,多个事务可能并发的对缓存页里的同一批数据进行增删改查操作,于是这个并发增删改查同一批数据的问题,可能就会导致所谓的脏写,脏读,不可重复读,幻读。
    这个问题的本质是数据库多事务并发问题,那么为了解决多事务并发问题,数据库设计了事务隔离机制,MVCC多版本隔离机制,锁机制。用一整套机制解决多事务并发问题。