如果一个事务读到了另一个未提交事务修改过的数据,意味着发生了脏读现象。
如果一个事务修改了另一个未提交事务读取的数据,意味着发生了不可重复读现象。
这里有疑惑,读取是不需要加事务的,感觉定义有点不好理解。
一个事务在按照同样的条件查询多次读取记录时,在后续读取时读到了之前没有读到的数据。可能由别的事务执行 insert 插入的,也可能是执行了 update 插入的。
这里感觉跟脏读类似,都是读,未提交事务修改过的数据,可以认为是 insert、update 产生的。
由定义得知,脏读和不可重复读两者的定义正好完全相反。
由这几个一致性问题,定义了一个 sql 标准
READ UNCOMMITTED,就是读到了未提交事务的数据。
READ COMMITTED,REPEATABLE READ,就是读到了已提交事务的数据。
SERIALIZABLE,通过串行的方式来执行事务记录。
READ COMMITTED与REPEATABLE READ的区别是:生成 ReadView 的时机不同。
READ COMMITTED隔离级别的事务在每次查询开始时都会生成一个独立的 ReadView。
REPEATABLE READ隔离级别的事务只会在第一次执行查询语句时生成一个 ReadView。
所谓的 MVCC 就是在使用READ COMMITTED、REPEATABLE READ这两种隔离级别的事务执行普通的 select 操作时,访问 undo log记录的版本链的过程。