我之前使用过WCF服务,现在我有了一个新项目.
我还处于设计阶段,我想知道处理以下场景的最佳方法是什么.
我将让多个客户端同时连接到我的WCF服务,在服务上触发不同的方法(Operation Contracts):
答:一些被解雇的方法只是纯粹的“读取”方法(例如GetListOfCustomers).
B.有些被解雇的方法是复杂的’Read’方法(例如GetAllProductsByCustomerId).
这些方法需要从DB获取客户,
检查他的东西,然后得到他买的所有产品.
(意思是,在此方法中有2次调用数据库).
C.有些是’写’方法(例如’RemoveCustomer’或’SetProductOutOfStock’).
我的问题是 – 如何同步所有这些调用,以便我不会遇到并发问题?
我不希望整个服务串行处理调用,因为它会损害客户端的性能(某些调用可能需要3-4秒才能处理).
那么我的解决方案是什么?
对具有“多个”线程的所有客户端使用“单个”实例,然后使用锁定对象?这不仅仅是串联的结果吗?
或者我是否需要一个不同的锁定对象用于’读’,另一个锁对象用于’写’?
或者我需要锁定“写入”功能和“读取”功能的其他东西?
这是我在StackOverflow上的第一个问题.
感谢任何可以提供帮助的人!
更新:我将使用’Linq-To-SQL’作为我的ORM.
最佳答案 您不应该担心数据一致性问题,也不应该担心执行数据库查询时的并发性.如果我正确理解了您的情况,那么您需要确保的是,在执行一系列您希望“原子”的数据库查询时,您始终如一地使用事务.我将尝试在一个例子中解释它:
>从数据库中获取所有客户.
>对于每个客户,执行一个
查询更新一些相关数据.
在这种情况下,您不希望发生的情况是,在1的查询返回之后以及从2的所有查询完成之前,数据被另一个查询更改的情况.例如,如果同时删除其中一个客户,则更新相关数据毫无意义 – 这甚至可能导致一些错误.
所以你需要做的就是在1之前放置BEGIN TRANSACTION之类的东西,然后在2之后放置COMMIT.查找你正在使用的SQL方言的确切语法.
这基本上可以确保您使用的数据不会发生变化.事实上,它将被您的交易锁定;以及可能使用相同数据的所有其他查询都在等待您的事务完成.数据库智能地执行此类锁定,始终尝试锁定尽可能少的数据.