• MySQL(25):事务的隔离级别出现问题之 不可重复读


    1. 不可重复读

    所谓的不可重复读(Non-Repeatable Read)是指事务中两次查询的结果不一致,原因是在查询的过程中其他事务做了更新的操作。

    例如,银行在做统计报表的时候,第一次查询a账户有1000元,第二次查询a账户有900元,原因是统计期间a账户取出了100元,这样导致多次统计报表的结果不一致。

    不可重复读和脏读有点类似,但是脏读是读取了另一个事务未提交的脏数据,不可重复读是在事务内重复读取了别的线程已提交的数据。

    2. 演示不可重复读

    (1)b账户:首先在b账户中开启一个事务,然后在当前事务中查询各个账户的余额信息,查询结果如下:

    (2)a账户:在a账户中不用开启事务,直接使用update语句执行更新操作即可,具体语句如下:

    update account set money=money-100 where name='a';

    由于a账户只需要执行修改的操作,不需要保证同步性,因此直接执行SQL语句就可以,执行结果如下所示:

    接下来使用select语句查询a账户的余额,如下:

    (3)再次回到b账户,如下:

    b账户:当a账户中的更新操作执行完毕之后,在b账户之中再次查询各账户的余额,发现a账户变成900元。

    两次b账户查询的结果不一致,实际上这种操作是没有错的

    3. 如何解决这个问题?

    设置b账户的事务的隔离级别

    b账户:为了防止重复读的情况发生,可以将该事务的隔离级别设置为Repeatable Read(可重复读),具体如下:

    set session transaction isolation level repeatable read;
  • 相关阅读:
    JavaScript 数组去重,并按大小排序
    JavaScript 把秒转换成分钟,比如100s转换成 01:40
    JavaScript style.left、offsetLeft的问题
    JavaScript画出一个星罗密布
    bootstrap轮播图怎么居中
    JavaScript 把数组里的0放到后面
    JavaScript----- Moving Zeros To The End
    5.2 Array类型的方法汇总
    5.2 Array类型介绍
    5.1 JS中Object类型
  • 原文地址:https://www.cnblogs.com/hebao0514/p/5494442.html
Copyright © 2020-2023  润新知