本文将介绍数据库脏写、脏读、不可重复读、幻读的概念。这些概念是了解数据库中事务隔离级别、MVCC多版本并发控制的基础。

脏写

脏写即写了修改后未提交的记录。
例如:A修改一个值,未提交,紧接着B也修改这个值,此时A回滚。结果是事务A的undo日志记录了A修改的值的原始值,并回滚到A修改前的状态。因此,在B看起来就是自己修改了值却没有变化,明明修改了却和没改似的。

脏读

脏读即读到了修改后未提交的记录。
例如:A修改一条记录,还没提交;此时B读到A修改的值;然后A回滚。结果是B再读读到了修改前的值。

不可重复读

不可重复读即在事务执行的先后读到的值“不一样”。但这和脏读是不同的。
例如:B读一条记录,在B还没结束时,A修改了数据且马上提交;此后B再读,读出的值不一样。
要做好不可重复读和脏读的区分,脏读是比不可重复读“严重”的。因为脏读读到了“脏数据”,即“本不该出现的数据”,也就是未提交的数据。但不可重复读中读到的都是正常的、提交过的数据,也就是这些数据都是被确认的、“正确的”。
所以不可重复读可能不是一个问题,但是在一些业务上可能就要求要可重复读,即一个事务一开始读到的是什么,最后也要读到什么,而不需要读到“最新的值”。

幻读

幻读可以理解为行方向的不可重复读。
例如:B查询一个表的记录条数,10条;A插入了2条并提交;然后B再查询表的记录条数,12条。这就是幻读。