幻读

2020-05-06  本文已影响0人  lsh的学习笔记

什么是幻读?

同一事务中,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在

举例:

-- 幻读:第一次执行可能返回2条结果,第二次执行可能返回4条结果;
select * from t where a > 2;

有什么影响?

违反了事务的隔离性。当前事务能看到其他事务的结果。

如何解决?

Oracle

把事务隔离级别调到Serializable级别,即串行执行。

但是串行化的性能很差。

MySQL

把事务隔离级别调到Repeatable Read级别(默认),即可重复读,InnoDB引擎采用Next-Key Locking机制来避免幻读。

比如上面的SQL,对(2,+∞)这个范围排他X锁,在这个范围内的插入都是不允许的,从而避免幻读。

上一篇下一篇

猜你喜欢

热点阅读