脏读、幻读和不可重复读是数据库中常见的并发访问问题,它们描述了在多个事务并发执行时可能出现的数据读取问题。
脏读(Dirty Read)
指的是一个事务读取了另一个事务尚未提交的数据。
当事务B修改了数据但尚未提交时,事务A读取到了这个未提交的数据。如果事务B最终回滚了,那么事务A读取到的数据就是脏数据。
脏读可能导致事务A基于不正确的数据做出决策,从而产生错误的结果。
不可重复读(Nonrepeatable Read)
指的是在一个事务内,多次读取同一数据时,得到的结果不一致。
例如,事务A第一次读取数据时,得到了某个值,但在事务A的执行过程中,事务B修改了这个值并提交了。
当事务A第二次读取同一数据时,得到的值与第一次读取时不同。
不可重复读可能导致事务A在同一事务内基于不一致的数据做出决策,从而产生错误的结果。
幻读(Phantom Read)
指的是在一个事务内,多次执行相同的查询时,得到的结果集不一致。
例如,事务A第一次查询时得到了一组数据,但在事务A的执行过程中,事务B插入了符合第一次查询条件的新数据并提交了。
当事务A第二次查询相同条件时,得到的结果集中出现了新增的数据,就好像产生了幻觉一样。
幻读可能导致事务A在同一事务内处理了不一致的数据集,从而产生错误的结果。
重点区别一下不可重复读和幻读:
不可重复读关注,事务内读取到的,数据值内容发生的变化,而幻读关注,事务内执行相同查询时,结果集数量发生变化。
一句话总结脏读、不可重复读、幻读:
脏读:读取未提交的数据。
不可重复读:读取数据期间,数据被其他事务修改,导致再次读取时结果不同。
幻读:在范围查询期间,有其他事务插入或删除了记录,导致查询结果的数量不一致。
这些问题的出现是由于并发事务访问数据库时的隔离性不足所导致的。