nginx负载均衡造成的数据查询不同步

WBOY
Release: 2016-06-06 20:07:25
Original
1774 people have browsed it

生产环境用nginx实现A、B两台服务器的负载均衡,A、B共用同一个数据库
设备一个PHP接口做了数据存储唯一性的判断,不存在则存储,存在就不存。
如今发现设备在同一时间同样的数据请求了三次接口,数据库竟然发现了三条同样的数据。
现在可以肯定的是接口程序没有问题。
那么,问题出在哪里?又该怎么优化呢?

开始我认为是程序逻辑问题,但是我用相同的数据 for循环4次,发现只能保存一次,其他三次返回数据重复的错误码

回复内容:

生产环境用nginx实现A、B两台服务器的负载均衡,A、B共用同一个数据库
设备一个PHP接口做了数据存储唯一性的判断,不存在则存储,存在就不存。
如今发现设备在同一时间同样的数据请求了三次接口,数据库竟然发现了三条同样的数据。
现在可以肯定的是接口程序没有问题。
那么,问题出在哪里?又该怎么优化呢?

开始我认为是程序逻辑问题,但是我用相同的数据 for循环4次,发现只能保存一次,其他三次返回数据重复的错误码

你用for没有问题是因为,for是一个一个处理的。

一个是加唯一索引
一个是使用事务,然后查询时候存在的时候用select for update
一个是通过队列来处理

并发大了就会出现问题,即使是单台服务器。
1.中间加一次redis计数,incr 原子操作。
2.数据表加唯一字段索引,让数据库来解决这个问题。

你这个是指同一个客户端一次请求造成了3次请求+数据 还是3个客户端请求

问题出在这里:存储唯一性的判断,不存在则存储,存在就不存。

你这里没有做事务。

A判断不存在,这时候B正写入了一个,然后A已经判断不存在,A又写了一个。

应该把判断不存在和写入一个放在一个事务里处理。

如果数据库引擎不支持事务,要自己实现事务锁。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!