2

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

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

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

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

问题:

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

请建议我最好的方法!

4

2 回答 2

3

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

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


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

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

于 2009-09-24T06:10:01.577 回答
0

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

问候,史蒂夫

于 2009-10-29T00:44:51.973 回答