• 数据库事务隔离级别


    数据库事务的隔离级别有4个,由低到高依次为Read uncommittedRead committedRepeatable readSerializable。这四个级别能够逐个解决脏读不可反复读幻读这几类问题。

    √: 可能出现    ×: 不会出现

    脏读 不可反复读 幻读
    Read uncommitted
    Read committed ×
    Repeatable read × ×
    Serializable × × ×

    注意:我们讨论隔离级别的场景。主要是在多个事务并发的情况下,因此,接下来的解说都环绕事务并发。

    Read uncommitted 读未提交

    公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户。发现工资已经到账。是5000元整。很高兴。

    但是不幸的是,领导发现发给singo的工资金额不正确,是2000元。于是迅速回滚了事务,改动金额后,将事务提交。最后singo实际的工资仅仅有2000元,singo空欢喜一场。


    出现上述情况,即我们所说的脏读。两个并发的事务。“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。

    当隔离级别设置为Read uncommitted时,就可能出现脏读,怎样避免脏读,请看下一个隔离级别。

    Read committed 读提交

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

    出现上述情况。即我们所说的不可反复读,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

    当隔离级别设置为Read committed时。避免了脏读。可是可能会造成不可反复读。

    大多数数据库的默认级别就是Read committed。比方Sql Server , Oracle。

    怎样解决不可反复读这一问题。请看下一个隔离级别。

    Repeatable read 反复读

    当隔离级别设置为Repeatable read时。能够避免不可反复读。当singo拿着工资卡去消费时,一旦系统開始读取工资卡信息(即事务開始),singo的老婆就不可能对该记录进行改动。也就是singo的老婆不能在此时转账。

    尽管Repeatable read避免了不可反复读,但还有可能出现幻读

    singo的老婆工作在银行部门。她时常通过银行内部系统查看singo的信用卡消费记录。

    有一天,她正在查询到singo当月信用卡的总消费金额(select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单。消费1000元,即新增了一条1000元的消费记录(insert transaction ... )。并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元。singo的老婆非常诧异。以为出现了幻觉,幻读就这样产生了。

    注:Mysql的默认隔离级别就是Repeatable read。

    Serializable 序列化

    Serializable是最高的事务隔离级别。同一时候代价也花费最高,性能非常低,一般非常少使用。在该级别下,事务顺序运行,不仅能够避免脏读、不可反复读,还避免了幻像读。 


  • 相关阅读:
    Hard Rock
    Codeforces Round #416 (Div. 2) B. Vladik and Complicated Book
    codeforces 793B. Igor and his way to work
    codeforces 1B Spreadsheets
    HDU 1069 Monkey and Banana
    codeforces 2B The least round way
    【机器学习】 通俗说拟合
    python-八皇后问题
    python-核心知识思维导图
    python-@property 属性
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6735007.html
Copyright © 2020-2023  润新知