有关WCF服务的简单查询

时间:2009-09-24 05:20:00

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

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

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

  1. Read()此方法从sql server检索所有员工。
  2. Write()此方法将employee表中的员工信息(添加,更新,删除)写入sql server。
  3. 现在我开发了一个基于桌面的应用程序,通过该应用程序,任何客户端都可以通过使用Web服务来查询,添加,更新和删除员工信息。

    问题:

    如果多个客户希望同时更新员工信息,我该如何处理该方案? sql server本身是否通过使用数据库锁来处理它?<​​/ p>

    请建议我最好的方法!!

2 个答案:

答案 0 :(得分:3)

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

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


评论;对不起,我老实说没有看到那些评论;有时候如果你一次收到很多评论,stackoverflow就不会那么容易。这里有两个不同的概念;等待是阻塞的症状,但如果有100个客户端更新同一记录,则在每次事务处理期间阻止是完全合适的。为了简单起见:除非我能证明瓶颈(需要额外的工作),否则我将围绕更新操作启动 serializable 事务(默认情况下TransactionScope使用它)。这样就可以了:对于大多数情况,你会得到适当的阻止(ACID等)。

然而;第二个问题是并发:如果您为同一条记录获得100次更新,您如何知道应该信任哪些?大多数系统都会将第一次更新,然后丢弃其余系统,因为它们是在对数据进行陈旧假设的情况下运行的。这是timestamp / rowversion的用武之地。通过在UPDATE语句中强制执行“timestamp / rowversion必须匹配”,可以确保人们只能更新自拍摄快照以来未更改的数据。为此,通常将rowversion与您正在更新的任何感兴趣的数据保持一致。

答案 1 :(得分:0)

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

此致 史蒂夫

相关问题