Heim  >  Artikel  >  Backend-Entwicklung  >  并发重复数据问题

并发重复数据问题

WBOY
WBOYOriginal
2016-06-06 20:37:311098Durchsuche

需求是,在同一时间(精确到毫秒),每一条数据,都有一个数字,如果库中
这个时间的数字存在,那么,就更新计数,如果不存在,就新增一条。

程序是先查询,根据结果执行插入或更新,现在存在一些,同一时间,同样数字的情况
应该是并发导致的,是不是只有在查询,插入/更新 ,这里加锁才能解决这个问题?
如果是在多个tomcat集群的情况下,是不是只能是分布式锁来解决?

回复内容:

需求是,在同一时间(精确到毫秒),每一条数据,都有一个数字,如果库中
这个时间的数字存在,那么,就更新计数,如果不存在,就新增一条。

程序是先查询,根据结果执行插入或更新,现在存在一些,同一时间,同样数字的情况
应该是并发导致的,是不是只有在查询,插入/更新 ,这里加锁才能解决这个问题?
如果是在多个tomcat集群的情况下,是不是只能是分布式锁来解决?

数据创建的时候默认0,直接+x不就行了。。。何必要插入

mysql的这个语法可以解决

INSERT ... ON DUPLICATE KEY UPDATE

链接 INSERT ... ON DUPLICATE KEY UPDATE

首先,你的并发数到底有多大,如果太大,直接更新数据库的话,会对数据库造成很大的压力

提供另外一种思路,使用redis
redis中又一个方法INCR,可以原子的递增

这个场景用redis是一个不错的选择。

主要问题是排重,用一个hset插入每一条记录的key,插入新值前hget一下看是否已经有了,没有再插入计数。
INCR作为计数肯定是没任何问题,读取这个值即可。

这个使用数据库的锁机制就可以了

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn