• Mysql的隔离级别 以及对脏读、不可重复读、幻读的理解


    Mysql的隔离级别

      Mysql的默认隔离级别为:Repeatable read

      Oracle的默认隔离级别为:Read committed

    Mysql有四大隔离级别

        1.Read uncommitted 读未提交内容

        2.Read committed 读提交内容

        3.Repeatable Read 可重读

        4.Serializable 序列化(可串行化)

        这四大隔离级别分别可以,逐个解决脏读、不可重复读、幻读这几类问题

        

    脏读

      读取未提交的数据,也被称之为脏读(Dirty Read)。

      例如:

        公司发工资了,领导把10000元打到bin的账号上,但是该事务并未提交,而bin正好去查看账户,发现工资已经到账,是10000元整,非常高兴。可是不幸的是,领导发现发给bin的工资金额不对,是5000元,于是迅速回滚了事务,修改金额后,将事务提交,最后bin实际的工资只有5000元,bin空欢喜一场。

      以上的案例,并发了两个事务,"事务A:领导给bin发送工资"、"事务B:bin查询工资"。

      事务B读取到了事务A尚未提交的数据。

    不可重复读

      一个事务只能看见已经提交事务所做的改变。就被称之为不可重复读(Nonrepeatable Read)。

      例如:

        bin拿着工资卡去消费,系统读取到卡里确实有5000元,而此时她的老婆也正好在网上转账,把bin工资卡的5000元转到另一账户,并在bin之前提交了事务,当bin扣款时,系统检查到bin的工资卡已经没有钱,扣款失败,bin十分纳闷,明明卡里有钱,为何没有。

      以上的案例,并发了两个事务,"事务A:bin消费"、"事务B:bin的老婆转账"。

      事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

    幻读

      当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。也被称之为幻读 (Phantom Read)。

      幻读:类似于不可重复读,都是在一个事务周期内读的数据不一致,区别在于幻读是侧重于插入操作带来的影响,而不可重复读是编辑或者删除带来的影响。

      例如:

        bin的老婆管斌很严厉,每个月bin的老婆都要去查看bin的消费记录。一天,她正在查询bin当月的总消费金额为2000元,而此时bin正在外面和朋友们吃火锅,吃完后去柜台买单,消费500元,即新增了一条500元消费记录,并且提交了事务,随后bin的老婆将bin当月的总消费打印在一张A4纸上,却发现消费的总余额为2500,bin的老婆就很疑惑,以为出现了幻觉。

      以上的案例,并发了两个事务,"事务A:bin老婆查询"、"事务B:bin消费"。

      事务A先读取了数据,事务B紧接了添加了新的数据,并提交了事务,事务A再次读取该数据时,数据已经发生了改变。

     

  • 相关阅读:
    Learning Intents behind Interactions with Knowledge Graph for Recommendation
    php_network_getaddresses: getaddrinfo failed: Name or service not known
    下载低版本Xcode方法
    世界奇妙周刊 第2期
    倒计时 | 7.24 阿里云 Serverless Developer Meetup 杭州站报名火热进行中!
    《网镜》001.生成word勘验报告
    java 常用集合使用方法
    Excel 常用操作
    《世界上最简单的会计书》
    mysql 通过坐标换算距离
  • 原文地址:https://www.cnblogs.com/jiekesi/p/14090011.html
Copyright © 2020-2023  润新知