**
数据库隔离性分析之为什么会产生脏读?
**
数据库的物理存储会分成许多个页(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