问题的描述是这样的:url接口的形式向用户返回100条数据库中的A表(某字段排序后)中status为0的数据,用户要是在web上操作了某条数据以后就改为1。
我想解决的问题是如何在多用户高并发的情形,用户请求该接口获得分配的数据如何处理能保证都是唯一的。处理了以后,不一定需要向每个用户都是固定的100条数据。但要保证每个用户得到的数据和其他用户的数据不能有重复。要求是不考虑sql server 数据库的特性。像存储过程中事务,取了这100,然后再修改这100条数据的其他字段。这样sql 在用户并发时候,这100条数据另外的用户就无法获取。因为sql server 中的更新锁的现在。不知道是不是这样的。但是这样处理的话,在并发性不是很高,比如A得到了100条数据,在web上操作,status还没有改为1。 然后B用户请求URL接口欲获得100条数据,这个时候也有可能B用户的100条数据在A用户中有重复的。(这里这种情形我不知道描述的对不对。)
 完全使用C#语言的特性完成。我之前处理的是mongodb数据库。之前项目经理说可以使用httpRuntime.cache 增加 移除 比较的形式解决。但是我一直不成功。
写的web api 接口,使用Task模拟高并发测试,感觉数据有重复。
非常感谢大家。

解决方案 »

  1.   

    想过,要是用户获取的100条数据标示已读,但是用户只是获取了一下数据,没有进行操作,需要改为1的字段就还是0,那这100条数据,下次怎么获取呢?应该就是你说的那个问题。这100条数据在cache中设置过期,过期到了在把数据库中得已读标示还原,可行吗?这个可行的话要httpruntime.cache到期的功能能自动触发才行。
      

  2.   

    什么叫用户,你们的网站如何区分用户?先把这个搞清楚。如果搞不清楚,撤掉项目经理,那是他的起码的责任。连这个都不告诉你们,就让你们上csdn瞎问。在这样的人手下以后还能不能开发web应用啊?
      

  3.   

    如果你明知道是你用的关系数据库系统太慢,那么就不用翻来覆去解释什么“改变status、更新锁、有重复”之类的。你不过是涉及了两个概念,一个是用户,一个是所谓的“数据”。然后只是有个简单的匹配关系。这种简单东西之所谓纠结,在于“关系数据库的脑袋”的限制。首先你要抛开数据库,其实任何好的设计都应该先忘掉你的所谓的数据库的增删改查,要是改不了就没有什么好的设计。其次搞明白你的“用户”到底该如何设计。“用户”是指在内存里的对象实体,而不是什么数据库表中的记录。如果你从关系数据库的“增删改查”去理解用户概念,那么最多就是做点简单的OA给人家出出公文、请假、考勤之类的报告而已。如果用户是内存中的实体,而要分配的(含糊的)数据也是内存中的实体,那么每秒准确地分配几十万数据给几万个用户,这也是很容易的小程序而已。
      

  4.   

    求解决方案,需要解决的问题就是url接口, 向各个用户分配的100条数据,各个用户之间不重复,去重以后给用户的数据可以少于100,数据库是mongodb。
      

  5.   

    这个应该数据库定时操作吧或者有监控程序。正常情况下没问题,但是当客户端异常(网页/浏览器突然关闭)的时候,httpruntime.cache到期的功能不触发。