数据库主从同步延迟导致坑

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/li_xue_zhao/article/details/80054139
背景:

线上出现了用户注册了多条重复记录

排查问题:
  • 第一种一开始怀疑是不是并发问题造成,后来查了大多数都是隔了几秒钟,并发出现概率小
  • 第二种就是看出现重复数据的时间,然后线上看到从库出现了延迟复制的问题,这就问题出现的关键
原来代码逻辑:

先查询传过来的openid是否在从库中存在,不存在就进行主库插入。

出现问题关键点:

前端第一次请求时候,判断从库不存在,然后主库插入注册数据。由于出现复制延迟,前端第二请求过来,因为延迟了从库查询还是不存在,那就GG了,又重复插了一条。

解决方法:

方法有很多种,列举一些
- 我们采用的是在注册的时候在加多锁判断,如果这么多分钟内重复注册就代表重复注册,后面的请求就直接返回。
- 可以用唯一索引限制
- 或者用insert … select … where not exist 这种方式

延伸一些也是很明显的主从复制的错误:
$intStatus = $arrInput[‘status’];
$this->objActTmp->updateInfoByAId($intActId, $intStatus);
// 更新后,马上查
$arrActContent = $this->objActTmp->getActByStatus($intStatus);

这就是主从延迟出现的地方,update后,马上get。

参考链接:

http://itindex.net/detail/57223-mysql-%E5%A4%8D%E5%88%B6-%E5%BB%B6%E8%BF%9F

展开阅读全文

没有更多推荐了,返回首页