• 数据库脏读、幻读


    脏读
    一个事务读取另一个事务未提交的数据:事务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存储引擎通过多版本并发控制机制解决了这个问题。
    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超市现象和锁竞争。
  • 相关阅读:
    「2021.08 实战」Springboot wagon 2.x 部署线上(自动重启)
    Springboot 使用 CacheManager(缓存是储存到内存中去的,程序结束,缓存也没了)
    [Linux]在CentOS中安装Python3的方法
    [VS2015]关闭_CRT_SECURE_NO_WARNINGS警告
    STL源码剖析-智能指针shared_ptr源码
    透明网桥-消除循环功能
    MPEG-PS封装格式
    RTP timestamp与帧率及时钟频率的关系
    Pyhton @staticmethod
    Python @classmethod
  • 原文地址:https://www.cnblogs.com/nubi/p/dirty-data.html
Copyright © 2020-2023  润新知