一、脏读(未提交读)
脏读不是脏页
- 脏页是指在缓冲池中已经被修改的页,但是还没有刷新到磁盘中,即数据库实例内存中的页和磁盘中的页的数据是不一致的,当然在刷新到磁盘之前,日志都已经被写入到了重做日志文件中
- 而脏数据是指事物对缓冲池中行记录的修改,并且修改过的记录还没有被提交(commit)
- 对于脏页的读取,是非常正常的。脏页时因为数据库实例内存和磁盘的异步造成的,这并不影响数据的一致性(或者说两者最终回达到一致性,即当脏页都刷回到磁盘)。并且因为脏页的刷新时异步的,不影响数据库的可用性,因此可以带来性能的提高
- 脏数据截然不同,脏数据是指未提交的数据,如果读到了脏数据,即一个事务可以读到另外一个事务中未提交的数据,则显然违反了数据库的隔离性
- 脏读是指:在不同的事务下,当前事务可以读到另外事务未提交的数据。脏读也称为未提交读
- 脏读发生在隔离级别“READ UNCOMMITTED”下,而目前InnoDB默认的事务隔离级别为“READ REPEATABLE”。SQL Server默认为“READ COMMITTED”,Oracle同样也是“READ COMMITTED”
- 脏读隔离看似毫无用处,但是在一些比较特殊的情况下还是可以将事务的隔离级别设为“READ UNCOMMITTED”。例如replication环境中的slave节点,并且在该slave上的查询并不需要特别精确的返回值
演示案例
- 下面是一个脏读的演示过程,我们将一步一步的展现出这个过程
- 建立一张表,只有一个字段a,然后向表中插入一条记录
create table t( a int not null )ENGINE=INNODB; insert into t select 1; select * from t;
- 会话A:将的隔离级别设置为“READ UNCOMMITTED”ÿ