【问题标题】:control Concurrency : syncing data through web services; How?控制并发:通过网络服务同步数据;如何?
【发布时间】:2011-06-03 06:01:04
【问题描述】:
实际上,我开发了一个带有 PDA 应用程序部分的 Asp.net 网站。案例是公司的员工早上来,并在他们的 PDA 中获取数据,他们整天都在处理这些数据,晚上他们再次回到办公室或通过任何网络访问他们更新服务器上的数据。我们通过 Web 服务做到了这一点,因为 Web 服务是远程方法,因此他们只能通过 Web 访问来访问它。
现在的问题是并发,当通过 web 服务同步时如何控制并发,但是他们可能有很多员工尝试一次更新数据。
在网络服务中,我们从 PDA 应用程序接收 DataTable,并通过 LINQ 与 Sql Server 进行更新或插入操作。
【问题讨论】:
标签:
.net
asp.net
web-services
concurrency
remote-access
【解决方案1】:
客户带走的数据有哪些用例?他们只是更新数据还是同时插入新数据?
对于仅更新数据,您需要确定特定行的最后一个值是否正确(例如,提交具有最新时间戳的值)或其他数据中是否存在值。
在处理插入数据时,我将假设您的数据库使用增量主键。在这种情况下,您将不能仅仅提交从 PDA 应用程序接收到的 DataTable。您必须确定哪些是新行,然后将那些没有增量 ID 的新行插入到服务器表中,以生成新的增量 ID。然后,您必须使用生成的新 ID 更新 PDA 的 DataTable。
为了处理处理更新的实际顺序(多个客户端同时同步),我建议同步过程将数据集放入队列中,以便按顺序管理服务器更新,这使得该过程有点更简单。
【解决方案2】:
查看 Linq ChangeConflictException 类,当针对相同数据发生两次更新时将抛出该类。您可以使用它来放入一些冲突解决代码。例如,如果两个销售人员向同一个客户销售产品,您可以更改标识符,然后再次尝试提交。或者更改可能完全可以覆盖,在这种情况下,您可以简单地检索新值然后提交。
另一种方法可能是创建相互排斥的存储过程和/或在运行时保证一致性。这样您就不需要使用 linq,您可以对更改进行一些解析,然后针对 DB 运行适当的 SPROC 以插入订单或更新客户详细信息。
必须在设计时处理应用程序中的并发性以使其正常工作。
【解决方案3】:
您可以做的是创建一个由“提交”请求组成的类似 FIFO 的通道。在这种情况下,您一次只能执行来自一个客户端的修改(所有其他客户端都必须等待)。同时您需要跟踪已更新的行(新行可能不是这种情况)如果有任何冲突更改(用户试图修改已被另一个用户修改的行),那么客户应该知道它们(或者您可以尝试自动合并这些更改)。