论坛每个帖子都有一个id号,从1开始增长,每新增一个帖子,id增1
假设帖子有三项,id,文本和时间
在后端,设计一个类Article,类里就有三项:id, text, time
现在这个id增长有两种思路:
1) 利用数据库自增,id设为主键,启动数据库自增
2) 页面帖子前,利用ajax请求,取得数据库当前最大号maxid,然后帖子的id设为maxid+1
2)的思路在高并发的时候有问题,有可能多人同时发帖从而ajax请求获得同样的id,然后他们的帖子都是id+1
但是如果是1),那么提交帖子的时候,帖子数据只有两项,text和time
这样的话,后端可能就要设计两个类
一个Article有三项,id, text, time,另一个只ArticleWithoutID有两项 text, time
因为前端用户如果查看帖子,那么后端就要返回id, text, time三项了
但是要设计两个类,又感觉怪怪的
大家怎么看?
巴扎黑2017-04-18 10:31:35
肯定是在服务器端自增,不然可能冲突的。
你可能会问,我都取了最大的为什么还会冲突。如果你知道为什么数据库会有锁这个概念,你就不会在这里迷茫了。
并发大的时候,可能是同时取得的最大ID,提交时,一个先一个后,就会导致一个提交失败。
另外前端数据可以伪造,作为程序员对前端的数据一定要持怀疑态度,要验证
阿神2017-04-18 10:31:35
id数据库端自增肯定是确定的,前端自增高并发肯定就玩完,毋庸置疑的。根据你的需求,一个类完全可以搞定,没有那么复杂。(id自增这个方案并不好,高并发不推荐)
1,前端给服务端发了一个article对象,包含text和time。
2,服务端把这个对象存入数据库,数据库自增生成id。数据库端有个并发处理。
3,存入成功后返回整个数据或者id给前端都可以。
4,前端接到成功的消息,再把当前的帖子显示在列表里。此时已经拿到了帖子的id,能根据id查询。
====
建议在前端生成随机id,这样数据库端高并发也不会因为处理自增问题而损失性能。