隔离级别 | 脏读(Dirty Read) | 不可重复读(Non-Repeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
读已提交 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
序列化 | 否 | 否 | 否 |
这个表格以可读性的方式总结了四种隔离级别下可能发生的并发问题。
以下是对脏读(Dirty Read)、不可重复读(Non-Repeatable Read)和幻读(Phantom Read)的解释及其如何发生的描述:
-
脏读(Dirty Read):
- 定义:脏读是指一个事务在读取了另一个事务未提交的数据后,后者发生了回滚,那么读取到的数据是无效的,称之为脏读。
- 发生方式:当一个事务修改了某些数据,但尚未提交时,另一个事务读取了这些未提交的数据,然后第一个事务回滚,导致第二个事务读取到的数据实际上是无效的或不一致的。
-
不可重复读(Non-Repeatable Read):
- 定义:不可重复读是指在一个事务内的两次查询之间,另一个事务修改了数据并提交,导致两次查询返回的结果不一致,即第二次读取到的数据与第一次读取到的数据不一样。
- 发生方式:当一个事务在读取数据后,另一个事务修改了这些数据并提交,然后第一个事务再次读取同样的数据,结果与之前不一致,因为数据已经被修改。
-
幻读(Phantom Read):
- 定义:幻读是指一个事务在读取了一系列的数据后,另一个事务插入了一些新的数据,导致第一个事务在后续读取相同的数据时,发现有额外的数据出现,就像出现了幻觉一样。
- 发生方式:当一个事务在读取某些数据后,另一个事务插入了新的符合查询条件的数据,并提交,然后第一个事务再次读取相同的数据,结果发现有新的数据出现,就好像出现了幻觉一样。
这些并发问题通常是由于多个事务同时对数据库进行操作,而没有足够的隔离度保证,导致了数据的不一致性和可见性问题。不同的事务隔离级别可以解决或减轻这些问题的发生。
如何避免?
资源加锁,如redis分布式锁