单用户的一次并发[原创]
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!往往从设计的环节,我们可以规避很多东西。用户永远是最重要的,设计的出的产品,一定多为用户着想!多做出一些用户操作感好的产品!
浙公网安备 33010602011771号