首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同步WCF服务中的数据库访问?

如何同步WCF服务中的数据库访问?
EN

Stack Overflow用户
提问于 2012-04-15 22:07:29
回答 4查看 1.9K关注 0票数 4

我以前使用过WCF服务,现在我有了一个新项目。我仍然处于设计阶段,我想知道处理以下场景的最佳方法是什么。

我将让多个客户同时连接到我的WCF服务,在该服务上触发不同的方法(操作合同):

A.一些触发的方法只是纯粹的“读”方法(例如,GetListOfCustomers)。

B.有些方法是复杂的“读”方法(例如GetAllProductsByCustomerId)。这种方法需要从数据库中获取客户,检查他的一些信息,然后获取他购买的所有产品。(也就是说,在这个方法中有两个对数据库的调用)。

C.有些是“写”方法。“RemoveCustomer”或“SetProductOutOfStock”)

我的问题是-如何同步所有这些调用,以避免并发问题?

我不希望整个服务连续地处理调用,因为它会破坏客户端的性能(有些调用可能需要3-4秒才能处理)。那我的解决方案是什么?

对所有具有“多”线程的客户端使用“单个”实例,然后使用锁对象?难道这不就是连续的结果吗?

还是我需要一个不同的锁对象用于“读”,另一个锁对象用于“写”?

还是我需要“写”函数的锁,以及“读”函数的其他东西?

这是我在StackOverflow上的第一个问题。感谢任何能帮忙的人!

更新:我将使用‘’作为我的ORM。

EN

回答 4

Stack Overflow用户

发布于 2012-04-15 22:39:06

在执行数据库查询时,您不应该担心数据一致性问题,也不应该担心并发性。如果我正确地理解了您的情况,那么您只需要确保您在执行一系列数据库查询时一致地使用事务,而您希望这些查询是“原子的”。我试着用一个例子来解释它:

  1. 从数据库中获取所有客户。
  2. 对于每个客户,执行一个更新一些相关数据的查询。

在这个场景中,您不想发生的情况是,当数据被另一个查询更改时,之后,来自1返回的查询,之前的,所有来自2的查询都完成了。例如,如果其中一个客户同时被删除,那么更新相关数据就没有意义了--这甚至可能导致一些错误。

所以,您需要做的就是将类似于BEGIN TRANSACTION的东西放在1之前,COMMIT放在2之后。查找所使用的SQL方言的确切语法。

这将确保,基本上,您正在处理的数据不会改变。实际上,它将被您的事务锁定;所有可能处理相同数据的其他查询都在等待您的事务完成。数据库智能地执行这种锁定,总是试图锁定尽可能少的数据。

票数 2
EN

Stack Overflow用户

发布于 2012-04-16 07:26:37

您正在为网络设计,因此您需要拥抱并发,没有出路。在我看来,采取锁和一切都不是在网络上工作的好方法。并发访问即将发生,您需要考虑如何处理并发错误,而不是防止并发问题。任何建立在web上的并发控制机制都是有限的,很难正确构建。

票数 0
EN

Stack Overflow用户

发布于 2012-04-16 07:37:44

我建议您阅读一些关于CQRS的内容,这是一种架构模式,可以在某种程度上解决您所面临的挑战。

作为您的示例解决方案,下面的图是一个可以满足您的需求的CQRS体系结构。

如果你想进一步解释的话,我很乐意提供。

更新

主要原则是将数据库读写分离到不同的数据库中。

然后使用复制来确保读取数据库是最新的。

您还可以通过将两个数据库合并为一个,将两个服务合并为一个来实现上述体系结构。但是,您最初的问题是基于数据库使用模式冲突这一事实而提出的数据库争用问题。

这就是为什么我提出CQRS作为解决方案的原因--数据库的写入端与读取端分离。读取端可以为选择进行优化(甚至可以为了访问速度而去规范化)。

这意味着,如果您同时通过相同的接口执行读写操作,您将不会面临相同的争用问题--这是您当前的方法。

此外,您不需要通过服务公开读取操作--简单的ADO会做得很好,服务端点只会引入延迟。

在从读取模型读取数据时,以及数据库写入服务更新数据模型时,仍然可以使用linq2sql。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10166571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档