Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架3.5中处理并发的锁表_Entity Framework_Concurrency - Fatal编程技术网

Entity framework 实体框架3.5中处理并发的锁表

Entity framework 实体框架3.5中处理并发的锁表,entity-framework,concurrency,Entity Framework,Concurrency,我们有一个web服务,它接受车辆上发生的任何故障的XML文件。然后,web服务使用EF3.5将这些文件加载到超规范化数据库。通常,XML文件的处理时间为10-20秒。我需要处理两种并发场景: 不同的车辆同时发送XML文件:这不是问题。EF的默认乐观并发性确保我能够将所有这些文件存储在相同的表中,因为它们的数据是互斥的 同一车辆同时发送多个文件:当我的系统试图同时将相同或类似的数据写入数据库时,这会产生问题。这并不罕见 我们需要第二点的解决方案 为了解决这个问题,我引入了一个锁表。基本上,当我开始

我们有一个web服务,它接受车辆上发生的任何故障的XML文件。然后,web服务使用EF3.5将这些文件加载到超规范化数据库。通常,XML文件的处理时间为10-20秒。我需要处理两种并发场景:

  • 不同的车辆同时发送XML文件:这不是问题。EF的默认乐观并发性确保我能够将所有这些文件存储在相同的表中,因为它们的数据是互斥的

  • 同一车辆同时发送多个文件:当我的系统试图同时将相同或类似的数据写入数据库时,这会产生问题。这并不罕见

  • 我们需要第二点的解决方案

    为了解决这个问题,我引入了一个锁表。基本上,当我开始向DB写入数据时,我会将一个串联的车辆id和故障时间戳(这与车辆为同一故障发送的多个文件相同)插入该表中,并在完成后删除记录。但是,在很多情况下,两个文件都试图同时将此行插入数据库。在这种情况下,一个文件成功,而另一个文件抛出一个重复的密钥异常,该异常将传递给Web服务的调用方


    处理这种情况的最佳方法是什么?我不想从数据库回滚任何内容,因为单个文件涉及许多表

    您希望得到什么样的解决方案?您当前使用锁表的方法正是您所需要的。如果由于重复而引发异常,您可以等待并稍后重试,或者将键入的错误发回客户端,让客户端稍后上载文件。这两种解决方案都很难看,但这正是您的应用程序目前提供的


    更好的解决方案是用另一个解决方案替换当前的web服务,其中web服务调用只会将作业添加到队列中,一些后台进程将处理这些作业,并确保同一辆车的两个文件不会同时处理。这也将为peek情况提供更好的吞吐量控制。缺点是,您必须实现一些通知,说明文件已被处理,因为它不会联机。

    由于我们不能使用消息队列,我想最好的选择是,如果锁表仅如@Ladislav所述。