什么是幻读?
在同一事务
中,连续
执行两次同样
的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在
的行
。
举例:
-- 幻读:第一次执行可能返回2条结果,第二次执行可能返回4条结果;
select * from t where a > 2;
有什么影响?
违反了事务的隔离性。当前事务能看到其他事务的结果。
如何解决?
Oracle
把事务隔离级别调到Serializable
级别,即串行
执行。
但是串行化的性能很差。
MySQL
把事务隔离级别调到Repeatable Read
级别(默认),即可重复读
,InnoDB引擎采用Next-Key Locking
机制来避免幻读。
比如上面的SQL,对(2,+∞)这个范围
加排他X锁
,在这个范围内的插入都是不允许的,从而避免幻读。
网友评论