系统在使用的过程中,经常会碰到以下情景:1. 由于网络延迟或者内存不足,点击一次按钮,页面没反应,结果点击第二次,造成数据重复。 2. 点击“提交”按钮,刷新页面,导致数据重复。 3. 点击“提交”按钮之后,点击浏览器后退,导致数据重复。
蒙版VS多浏览器:
针对情景1,如果我们点击操作完成,使按钮置灰或者显示蒙版,就可以避免重复点击误操作,也就避免了数据重复问题。看似没什么问题,但是仔细一想,如果我们不是在一个浏览器里呢,如果我打开了两个浏览器,在一个浏览器中点击“添加”按钮,在另一个浏览器里也点击了“添加”按钮,貌似蒙版就不管用了。(现实使用中是完全有可能出现类似的场景的,比如同时有两个人在操作添加任务)
原来是没有进行重复判断:
其实这个问题最根本的原因是程序没有进行重复判断,导致数据库重复写入。如果程序添加了重复判断逻辑,在一个浏览器页面中点击“添加”之后,数据成功写入数据库,在另一个浏览器中添加的时候,系统就会提示数据已存在,不能重复添加,这样就避免了数据重复写入。
如果同时提交呢:
我们再回过头来看一下我们的问题:系统提交了一次表单,然后再次提交的时候,程序会判断数据库是否已经存在该记录,如果存在写入数据就会失败,从而避免数据重复的错误。但是我们发现这个方法奏效有一个前提条件,两次表单提交是有先后顺序的。如果这样,假设我们同时提交两个表单,数据是不是还会重复呢?
并发问题:
这种问题就是我们常说的并发问题,并发问题的解决方案也有很多,比如:加锁排队处理等。测试时模拟并发也是需要借助工具的,因为手动操作无法达到并发的效果。并发的处理程度也视项目的需求而定,毕竟处理高并发的成本也是很高的。
致敬:
突然间觉得几百万人在同一时刻抢红包的场景,致敬微信团队!还有双11,12点钟声敲响的那一刻,致敬阿里巴巴团队!