c# - 关于WCF服务的简单查询

标签 c# sql-server wcf wcf-client

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

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

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

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

问题:

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

请建议我最好的方法!

最佳答案

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

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


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

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

关于c# - 关于WCF服务的简单查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1469873/

相关文章:

c# - 如何从代码覆盖率中排除 MVC Razor View ?

c# - 哪个 .NET 版本适用于 C# 5 异步功能

c# - 自动 'PrtScn' 击键就像 'Alt+PrtScrn'

c# - 是否有必要为 n 层架构上的每一层编写单元测试代码?

c# - 字节数组到 c# 中的双转换

sql - 连续日期的分组岛,包括错过的周末

sql-server - SQL Server Service Broker - 删除服务

sql-server - 如何强制 SQL Server 释放内存?

使用拦截器进行WCF参数验证

wcf - 银光 : WCF getting error on server but localhost works fine