脏读、不可重复读、幻读

70 阅读1分钟

脏读(Dirty Read):

  • 问题描述: 一个事务读取了另一个事务未提交的数据,然后该事务发生了回滚操作,导致读取到了未提交的、无效的脏数据。
  • 影响: 可能导致系统产生不一致的数据,因为事务读取到了临时的、中间状态的数据。

不可重复读(Non-Repeatable Read):

  • 问题描述: 在同一个事务中,同一查询在不同的时间得到了不同的结果。例如,事务在 T1 时读取了某一行数据,在 T2 时重新读取同一行时,数据已经被其他事务修改。
  • 影响: 可能导致事务在同一查询中得到不一致的结果,破坏了事务的隔离性。

幻读(Phantom Read):

  • 问题描述: 在同一查询中,不同的时间得到了不同的结果。例如,一个事务在执行 SELECT 查询时得到了一组数据,然后在稍后的时间再次执行相同的查询,但结果集中出现了新的行,导致了“幻像”行的出现。
  • 影响: 可能导致事务在同一查询中得到不一致的结果,特别是在高并发环境下,数据的变化可能导致查询结果的不确定性。

这三个问题都与事务的隔离性有关,SQL标准中定义了四个隔离级别:读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。不同的隔离级别会导致这些问题的出现概率不同,而选择合适的隔离级别是在保证数据一致性和并发性之间进行权衡的关键。