我们有一个Web服务,可以为车辆上发生的任何故障接受XML文件。然后,Web服务使用EF 3.5将这些文件加载到超标准化数据库。通常,XML文件在10-20秒内处理。我需要处理两种并发方案:
同时发送XML文件的不同车辆:这不是问题。 EF的默认乐观并发性确保我能够将所有这些文件存储在相同的表中,因为它们的数据是互斥的。
同一车辆同时发送多个文件:这会产生问题,因为我的系统会同时尝试将相同或相似的数据写入数据库。这并不罕见。
我们需要第2点的解决方案。
为了解决这个问题,我介绍了一个锁表。基本上,当我开始写入数据库时,我将插入的车辆ID和故障时间戳(对于相同故障的车辆发送的多个文件相同)插入到此表中,一旦完成,我将删除记录。但是,很多时候两个文件都试图同时将此行插入数据库。在这种情况下,一个文件成功,而另一个文件抛出一个重复的密钥异常,该异常将发送到Web服务的调用者。
处理此类方案的最佳方法是什么?我不想从db回滚任何内容,因为单个文件涉及许多表。
答案 0 :(得分:1)
您期望什么解决方案?您当前使用锁定表的方法正是您所需要的。如果由于重复而触发了异常,您可以等待并稍后再次尝试,或者将类型错误发送回客户端并让他稍后上传该文件。这两种解决方案都很难看,但这正是您的应用程序目前提供的。
更好的解决方案是使用另一种解决方案替换当前的Web服务,其中Web服务调用只会将作业添加到队列中,并且某些后台进程将处理这些作业并确保不会同时处理同一辆汽车的两个文件。这也可以为窥视情况提供更好的吞吐量控制。缺点是您必须实施一些已处理文件的通知,因为它不会在线。