MySQL怎么解决幻读的?
1. 串行化
串行化是最高的隔离级别,通过强制事务串行执行来解决“幻读”问题。
但会导致大量的锁竞争问题,实际应用中很少用。
什么是幻读
幻读是指在同一个事务中,多次执行相同的范围查询,结果却不同。
这种现象通常发生在其他事务在两次查询之间 插入或删除了符合当前查询条件的数据。
在可重复读隔离级别下,通过MVCC和临键锁可以在一定程度上避免幻读。
1 加临键锁
比如在查询时,显式加锁(比如for update),利用临键锁锁定查询范围,防止其他事务插入新的数据。
start transaction;
select * from user_info where id > 1 for update;
commit;
其他事务在插入数据时,会被阻塞,直到当前事务提交或回滚。
2 快照读
比如说在执行查询的事务中,不要尝试去更新其他事务插入/删除的数据,利用快照读来避免幻读。
----- 补充
什么是快照读?
快照读是InnoDB通过MVCC实现的 非阻塞读方式。
当事务执行select查询时,InnoDB并不会直接读当前最新的数据,而是根据事务开始时生成的Read View去判断每条记录的可见性,从而读取符合条件的历史版本。

浙公网安备 33010602011771号