zoukankan      html  css  js  c++  java
  • 数据库脏读、幻读

    脏读
    一个事务读取另一个事务未提交的数据:事务1读取一条数据并做了修改,此时事务2读取事务1已修改且未提交的数据;此时如果事务1回滚了修改操作,那么事务2读取的数据就是脏数据
    幻读
    一个事务按照相同的查询条件重新读取检索过的数据,但发现有新的数据插入:事务1按照条件a检索到b行数据,然后事务2再插入符合条件a的数据,当事务1再次按照条件a检索数据时发现多了事务2插入的数据
    丢失的修改
    两个事务同时修改了同一行数据并提交,其中一个事务覆盖了另一个事务的修改。
    不可重复读
    一个事务先后两次读取相同行的数据,发现数据不一致:事务1读取a行数据,事务2修改或删除部分或全部数据,事务1再次读取到的数据和第一次读取的的数据不一致。
    解决办法
    出现以上问题是数据库事务隔离级别的问题
    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离一般支持更高的并发处理,并拥有更低的系统开销。
    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,以为他的性能也不比其他级别好多少。读取未提交的数据,也叫脏读(dirty read)
    这个是大多数数据库系统的默认隔离级别(但不是MysQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),应为同一事物的其他实例在该实例处理期间可能会有新的提交,所以同一个select可能返回不同结果。
    这是MySQL的默认事务隔离级别,他确保统一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。InnoDB和FaIcon存储引擎通过多版本并发控制机制解决了这个问题。
    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超市现象和锁竞争。
  • 相关阅读:
    普通PC硬盘与DVR专用硬盘主要差别
    远程监控,需要安装控件,安装前对浏览器设置如下。硬盘录像机,采集卡通用...
    SQL Server不允许进行远程连接
    远程备份(还原)SQL2000数据库
    安装MSDE时提示 实例名无效
    冰雹,刨冰,危险人物
    北京首现最严重的0day攻击方式
    孤独,寂寞,无聊
    大家平时都在做什么
    华山之旅
  • 原文地址:https://www.cnblogs.com/nubi/p/dirty-data.html
Copyright © 2011-2022 走看看