【问题标题】:Simple query regarding WCF service关于 WCF 服务的简单查询
【发布时间】:2009-09-24 05:20:00
【问题描述】:

我有一个 WCF 服务,它公开了两种方法:

注意:wcf 服务和 sql server 部署在同一台机器上。 Sql server 有一张叫做employee 的表,用来维护员工信息。

  1. Read() 此方法从 sql server 检索所有员工。
  2. Write() 该方法将员工表中的员工信息写入(添加、更新、删除)到 sql server 中。

现在我开发了一个基于桌面的应用程序,任何客户端都可以通过该应用程序通过使用 Web 服务来查询、添加、更新和删除员工信息。

问题:

如果有多个客户要同时更新员工信息,我该如何处理? sql server 本身是否使用数据库锁来处理这个问题??

请建议我最好的方法!

【问题讨论】:

  • 回复cmets;抱歉,当你添加它们时,我真的没有看到这些。

标签: c# sql-server wcf wcf-client


【解决方案1】:

通常,在断开连接的环境中,optimistic concurrencyrowversion/timestamp 是首选方法。 WCF确实支持分布式事务,但这是在系统中引入冗长阻塞的好方法。大多数 ORM 工具将支持 rowversion/timestamp 开箱即用。

当然,在服务器上,您可能希望使用事务(基于连接或TransactionScope)来使单独的存储库方法“ACID”,但我会尽量避免在尽量用电线。


Re cmets;对此感到抱歉,老实说,我没有看到那些cmets;如果您一次获得很多 cmets,有时 stackoverflow 不会让这变得容易。这里有两个不同的概念;等待是阻塞的症状,但如果您有 100 个客户端更新同一记录,则在每个事务期间阻塞是完全合适的。为简单起见:除非我可以证明存在瓶颈(需要额外的工作),否则我将从围绕更新操作的 serializable 事务开始(TransactionScope 默认使用此事务)。那样是可以的:在大多数情况下,您都会获得适当的阻塞(ACID 等)。

但是;第二个问题是并发性:如果您对同一条记录进行 100 次更新,您怎么知道该信任哪个?大多数系统都会让 first 更新,并丢弃其余的,因为它们对数据的陈旧假设进行操作。这就是时间戳/行版本的用武之地。通过在 UPDATE 语句中强制执行“时间戳/行版本必须匹配”,您可以确保人们只能更新自拍摄快照以来未更改的数据。为此,通常将 rowversion 与您正在更新的任何有趣数据一起保存。

【讨论】:

  • 感谢马克的回复。如果您对此进行更多解释,那就太好了。我观察到的一件事是,每当我调用 WCF 服务的方法时,它总是调用服务类的构造函数。 (派生自 [ServiceContract] 接口的类。我的意思是说它始终使用每种方法(读取或写入)初始化来自 sql server 的连接。如果我做错了什么或这不是正确的行为,请纠正我!!
  • 例如当Client 1调用update方法时会初始化sql server连接并更新员工信息。如果两个或多个客户想要同时更新相同的员工信息怎么办? SQL 服务器是否维护 ACID 属性?如果假设有 100 个客户,那么第 100 个客户是否需要等待更多时间才能更新员工信息..
【解决方案2】:

另一种选择是您可以将 WCF 服务实例化为单例 (InstanceContext.Single) - 这意味着它只有一个实例在运行。然后,您可以在内存中保留一个简单的对象以用于更新锁定,并根据该对象锁定您的更新方法。当更新调用来自其他会话时,它们将不得不等到锁被释放。

问候, 史蒂夫

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2013-01-08
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多