MySQL锁--06---mysql幻读怎么解决的

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL锁--06---mysql幻读怎么解决的相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


查看mysql锁状况

查看innodb参数

打开 innodb_status_output_locks -------默认(off)

show engine innodb status

查看锁信息


mysql幻读

幻读

MySQL锁–04----加锁规则、案例

为什么会出现“幻读”?因为“insert”和“delete”操作没有规矩


假设有如下业务场景:

RR级别 可重复读(Repeated Read)

set autocommit = 0

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB ;

INSERT into user VALUES (1,'1',20),(5,'5',20),(15,'15',30),(20,'20',30);

幻读案例 1


执行流程T4如下:

  1. T1时刻读取年龄为20 的数据,事务1拿到了2条记录

  2. T2时刻另一个事务插入一条新的记录,年龄也是20

  3. T3时刻,事务1再次读取年龄为20的数据,发现还是2条记录,事务2插入的数据并没有影响到事务1的事务读取

  4. T4时刻,事务1修改年龄为20的数据,发现结果变成了三条,修改了三条数据

  5. T5时刻,事务1再次读取年龄为20的数据,发现结果有三条,第三条数据就是事务2插入的数据,此时就产生了幻读情况

上述操作T4的update语句,属于当前读,会生成新的Read View视图,所以是后面select 读出来是3条数据.产生幻读

小结:

  • 其实通过前面的分析,大家应该知道了快照读和当前读,一般情况下select * from …where …是快照读,不会加锁,而 for update,lock in share mode,update,delete都属于当前读
  • 如果事务中都是用快照读,那么不会产生幻读的问题,但是快照读和当前读一起使用的时候就会产生幻读

幻读发生的场景

单独使用快照读,不会产生幻读的问题,但是快照读和当前读一起使用的时候就会产生幻读

mysql幻读怎么解决的

加锁

InnoDB 使用间隙锁的目的 防止幻读

RR隔离级别

当前读: 依靠next-key来解决幻读问题,

快照读: 使用mvcc解决幻读

案例

MySQL锁–04----加锁规则、案例

以上是关于MySQL锁--06---mysql幻读怎么解决的的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 可重复读隔离级别,解决幻读了吗?

谈谈MySQL是如何解决幻读问题的?

MySQL有哪些行锁,是如何解决幻读的?

MySQL间隙锁(幻读解决原理)

mysql repeatable-read 一次利用间隙锁解决幻读案例

MySQL可重复读防止幻读