0
点赞
收藏
分享

微信扫一扫

高并发情况下同时执行两个update语句出现少数据的问题。


情景说明:

    我们为了记录页面的PV访问量。所以每一次页面点击都要记录进来,才能更准确。比如我要根据天来存储某个页面(首页)的访问量。所以,当数据过来的时候就需要判断,如果数据库(首页+时间)没有,则新增一条,如果数据库有,则更新这条数据。但是我们大部分部署的都是分布式系统,所以,当并发量高的情况下。就会在新增加的情况下,出现插入不成功的(异常情况)。所以如下是解决方法:

   一:技术完美型。(分布式锁+消息队列)

       所以在高并发情况下使用分布式锁的话,需要使用消息队列,这样我们在锁数据的时候,没有争取到锁的数据需要放到队列中,然后再次运行。

这种技术的好处,技术比较完备。但是需要对分布式锁和消息队列比较熟悉。对开发人员要求比较高。网上比较多。

 二:技术快速型。(数据库锁)

       这个情况,让我想当数据库是否有没有一种函数来实现。后来在网上找到insert 表名 ('字段1',‘字段2’)values{'1','2'}  ON DUPLICATE KEY UPDATE pv = pv + 1

这样的情况下。当是新增的时候,执行新增insert语句。当数据库已经存在,则执行on duplicate key update操作,查询出来的结果就是有两条影响。

但是有一个问题,数据量过大容易出现死锁的情况。

 

三:数据库更新型。 (update 跟新)

   由于一,二的一些弊端,我们还有一种方式,那就是用update语句。我们每次update都会行锁。但是有一个问题,就是每次提前生成一条记录,这样如果不访问,就会产生大量无效的数据。

  我在开发的时候遇到一个问题,高并发的情况下,我有两处执行了更新,当我们对某个字段进行的更新的时候A方法对pv+1 操作,同时B方法执行uv+1,但是我用了mybatis原生的update,。A方法:update A set pv=pv+1 where pageName='编号' 。 B方法:

update A 

<if pv!=null>

    pv=pv(之前的数据)

</if>

如果pv有值的话。就会出现问题。因为在高并发的情况下,由于同时执行A,B会出现PV数据出现问题。

   

 

 

举报

相关推荐

0 条评论