代码改变世界

单用户的一次并发[原创]

2012-07-26 14:14  tetang1230  阅读(350)  评论(0)    收藏  举报

线上竟然爆出fata error! Duplicate entry  '52549023' for key 'userid'

这是如何产生的呢?

 

贴一张图,然后慢慢解释。

 这是apache access log上的截图, 可以从访问时间,userid看出这是来自一个用户的并发请求!时间相同,用户相同。

那么这是如何产生的呢?

 

首先这个链接的访问都来自一个按钮的click操作, 当这个用户第一次点击之后,立即点击了第二次!这样便产生了一个并发请求!

所点击的页面的逻辑是这样的:

  先上数据库查询,如果数据库没有记录,再去做insert操作,其中为userid字段建立了唯一索引。

  两次请求进来后,发现数据库都没有记录,然后都做了insert操作!所以其中第二次insert操作必然会有 Duplicate entry的error!

  

用户为什么会有这样的操作呢?

  • 游戏响应时间稍慢
  • 用户网络带宽限制,导致失去耐性,从而导致用户连续的点击

如何避免这个问题?

  • 增强用户体验,从设计上杜绝,比如点击之后弹出一个等待框层, 后层html元素无法点击
  • 点击按钮之后,马上让按钮失效
  • sql语句可以这样写:

    INSERT INTO __TABLE_NAME__(user_id, type, count, ctime) VALUES
    (:user_id, :type, :val, NOW()) ON DUPLICATE KEY UPDATE
    count = count + :val

第一中解决方案更好,既增加了用户体验,又解决了这个并发的问题!

 

总结:

  一个新需求产生后,其实真的不必马上coding!往往从设计的环节,我们可以规避很多东西。用户永远是最重要的,设计的出的产品,一定多为用户着想!多做出一些用户操作感好的产品!