https://www.yduba.com/biancheng-5971569393.html
    高性能MYSQL有关于隔离级别的介绍

    MySQL默认操作模式就是autocommit自动提交模式。这就表示除非显式地开始一个事务(start transaction;),否则每个查询都被当做一个单独的事务自动执行并且提交
    通过以下命令可以查看当前autocommit模式

    1. show variables like 'autocommit';

    从查询结果中,我们发现Value的值是ON,表示autocommit开启。这是默认全局生效的。
    如更新一条记录会自动提交并且生效。除非手动开启一个事务start transaction;表明不是马上生效,需要commit才能生效。

    set autocommit = 0;关闭自动提交模式;用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。如更新一条记录不会马上生效,需要commit提交才会生效。
    此设置不是全局的,只在当前客户端或者当前session生效。


    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。
    低级别的隔离级别一般支持更高的并发处理,并拥有更低的系统开销。


    Read Uncommitted [‘ʌnkə’mɪtɪd](未提交读)— 事务可以读取其它事务未提交的数据,这也被称为脏读(Dirty Read)(其余不在事务中的正常select查询不会存在脏读的情况,前一个事务可以读取后一个事务未提交的数据,新开的事务是读取不到之前开的事务的脏数据的

    事务中的修改,即使没有提交,对其它事务也是可见的。
    本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少,且会导致很多问题

    实际会发生的脏读问题:前台提取10元红包到余额中(200元),事务中将红包的钱增加到余额共210元,后台也在相差不多的时间内给用户充值100,此时读取到的用户余额是前台事务中的脏数据:210元,再此基础上给增加100,共310元。如果前台没有发生错误没有回滚事务,那么此时账户余额变成了210元。如果前台用户提取红包到余额发送错误事务回滚,红包还在,此时后台看到账户余额已经是310。多充值了10元,同时前台用户10元红包还在,还可以提取。

    举个例子来说明一下 脏读, 如:在 test 库有一个表 tx,表里有3条数据,别外特别注意,测试之前先把自动提交事务关闭,并把隔离级别设置成Read UNCommitted

    set autocommit = 0;
    set session TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    select @@tx_isolation;
    


    1读未提交 Read Uncommitted - 图1

    然后模拟客户端B,也开启了一个事务;并更新一条操作,如:

    start transaction;
    update tx set num=10 where id=1;
    

    重点开始看了,此时,客户端B并没有提交事务,而客户端A却能获取 B 更新的数据, 这就是脏读,效果如下:
    1读未提交 Read Uncommitted - 图2
    注意:
    当关闭客户端b或者回滚事务的时候,客户端A获取的数据就不是脏读的数据了。
    其余不在事务中的正常select查询不会存在脏读的情况,读取的是正常提交的完整的数据,这里是读取到1
    隔离级别是对于当前的客户端而言的,当前的客户端设置为Read Uncommitted,当前客户端中就可以读取其余之后的事务中未提交的内容。
    A客户端是先开始事务的,然后B客户端开始事务,修改数据,不提交。此时A中可以看到B做出的修改、如果此时有个C客户端是在B之后按照A的操作打开的,那么是读取不到B做出的修改的,此时再次修改B的数据,A依旧可以读取到,C同样也读取不到B之后做出的修改。所以只有在B之前打开的客户端才能发生脏读,读取到B的脏数据。