脏读!幻读!不可重复读!mysql并发事务引发的问题
脏读!幻读!不可重复读!mysql并发事务引发的问题
并发事务引发的三个问题
①脏读
脏读(Dirty Read) 是数据库事务隔离级别中的一种现象。它发生在两个事务并发执行时,一个事务能够读取到另一个事务尚未提交的修改。
脏读的具体情况
- 事务A 对某个数据进行了修改,但尚未提交。
- 事务B 在事务A提交之前读取了该数据的修改结果。
- 如果此时事务A发生回滚(撤销未提交的更改),那么事务B读取到的实际上是一个无效的、更改后被撤销的数据。因为事务A的更改最终没有被提交,所以事务B读到的数据是不正确的,称为“脏数据”。
② 不可重复读
是指在一个事务中多次读取同一条数据时,读取的结果不一致,因为在两次读取之间,另一事务对该数据进行了修改并提交。 一个事务中可以进行多次读取,比如这个事务开始的时候读取一次,结束的时候读取一次。两次读取的结果不一样,这个就是不可重复读
不可重复读的具体情况
- 事务A 在第一次读取某条记录时,得到了一个值。
- 事务B 在事务A的第一次读取和第二次读取之间,对该记录进行了更新并提交了修改。
- 事务A 在第二次读取时,发现同一条记录的数据已经发生了变化,和第一次读取的结果不一致。
这种情况就是所谓的“不可重复读”,因为事务A无法在整个事务中多次读取到相同的结果。
③ 幻读
是一种事务并发问题,发生在一个事务(事务A)执行了多次相同的查询时,发现结果集中出现了新的“幻影”行,即记录的数量发生了变化,通常是因为另一个事务(事务B)在这期间插入或删除了数据。
幻读的具体情况:
- 事务A 执行了一次查询,获得了一个结果集。
- 事务B 在事务A的查询之后,插入了符合事务A查询条件的新数据或删除了部分数据,并提交了事务。
- 事务A 再次执行同样的查询时,结果集中包含了事务B插入的“新”数据,或者缺少了事务B删除的数据。
这就是幻读现象,因为事务A无法保证每次查询的结果集保持一致。