我有一个 WCF 服务,它公开了两种方法:
注意:wcf服务和sql server部署在同一台机器上。 Sql服务器有一张名为employee的表,用于维护员工信息。
- Read() 此方法从 SQL Server 检索所有员工。
- 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/