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如下:
-
T1时刻读取年龄为20 的数据,事务1拿到了2条记录
-
T2时刻另一个事务插入一条新的记录,年龄也是20
-
T3时刻,事务1再次读取年龄为20的数据,发现还是2条记录,事务2插入的数据并没有影响到事务1的事务读取
-
T4时刻,事务1修改年龄为20的数据,发现结果变成了三条,修改了三条数据
-
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幻读怎么解决的的主要内容,如果未能解决你的问题,请参考以下文章