数据库隔离性分析之为什么会产生脏读?

数据库的脏读发生在两个事务同时操作同一数据时。事务A修改数据但未提交,事务B从内存缓冲区读取到未提交的修改,导致读取到无效数据。事务日志用于跟踪ACID属性,先写入日志再批量同步到数据库文件,提高效率并确保数据一致性。
摘要由CSDN通过智能技术生成

**

数据库隔离性分析之为什么会产生脏读?

**

数据库的物理存储会分成许多个页(Page),记录都存储在页中,数据每一次IO,操作的最小单位是一个页。数据库运行时,会在内存中维护一个缓冲区(Buffer Pool)。缓冲区缓存部分的页(因为内存有限,所有不能把所有数据都缓存进来)。
——以上来自于知乎温正湖

以上也就很好的解释了为什么会产生脏读原因了,当你修改的数据在已经在内存中时,数据是其实时两份的(内存一份,磁盘一份),看你读的是哪份!

当一个数据库存在两个事务的时候,例:事务A,事务B,data1=10,两个事务共同修改同一个数据。
当事务A修改数据data1的时,先看pool中是否存在与之对应的页,若不存在,读取磁盘中的页,若存在,则直接使用在pool中的页。事务A将data1修改成为20后,但并未提交commit(其实即使你提交了也不一定会及时的写回磁盘,它只是将你的sql操作记录写回了磁盘日志文件,在最下面来说日志文件的好处),这时事务B开始读取数据data1,但此时data1所在的页已经存在于数据库缓冲区中,则直接进入pool读取data1,但此时的数据data1属于事务A并未提交的数据,属于无效数据,也就是我们Myspl中常说的的脏数据啦。

如图:数据库缓冲区Pool

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值