MySql 幻读思考

本文探讨了MySQL中的幻读现象及其影响,包括结果不符合预期和主从数据同步时可能出现的数据不一致问题。通过分析binlog的数据格式,指出单纯statement模式可能导致主从数据不一致。解决幻读的方法涉及快照读、当前读以及MVCC机制,特别是RR隔离级别下的Next-Key Lock。文章还比较了RR与RC隔离级别的优缺点,指出RR虽然解决了幻读,但性能相对较差,可能因间隙锁导致并发度降低。
摘要由CSDN通过智能技术生成

什么是幻读

幻读是指在事务执行期间,两次相同条件的读取,后面一次读取的结果中出现了前一次读取的结果中不存在的数据。出现这个问题的原因是因为其他事务执行之后新增了符合条件的数据,或将原有数据修改为符合条件。

幻读的影响

幻读带来的后果主要有两个:

1. 结果不符合预期

幻读会导致事务执行出现意料之外的结果,例如事务1查询主键为a的记录,如果不存在,则插入。
假如事务1查询主键为a的记录不存在时,事务2插入了主键为a的记录并提交,那么事务1执行插入语句时就会报错。

2. 主从数据同步时可能出现数据不一致问题

假设有数据库表t

create table t (
	a int,
	b int
) engine=innodb

同时有两个事务需要执行

事务1 事务2
begin
1. update t set a = 2 where b = 1;
begin
2. insert into t (a, b) values(1, 1);
commit
commit

假设源表中只有一条b=1的记录(0, 1),那么第1条语句执行完毕之后,紧接着事务2执行完毕并提交了࿰

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值