共享资源和并发用户 - .NET中的最佳实践?

时间:2011-08-17 10:40:15

标签: .net concurrency

有一个主要是关于访问数据库的应用程序。目前,它只允许单用户访问,我需要使其支持多个并发用户。问题是,没有办法在这些用户之间明确地分离资源,所有资源都必须共享:因此,10个用户可以打开资源,然后1个人可以修改该资源。

是否有任何框架,库或至少是解决此问题的最佳实践?这可能是一个非常受欢迎的问题,所以我相信应该有这些问题。

更新: “资源”我主要是指数据库中的数据。

更新: 更具体地说,当两个实体之间存在主 - 细节依赖关系时,一个用户打开它以删除一些细节而其他用户打开它以添加和修改某些细节。第一个删除数据的一部分,第二个将要修改。然后发生。

1 个答案:

答案 0 :(得分:1)

更新行时可以使用乐观锁定。一种方法是在所有表中添加 Version 列。这可能只是一个整数。基本上,当您第一次查询行时,您将获得Version列的初始值。然后在更新行时,将初始版本放在 where 子句中,然后还将版本与其他字段一起更新。

UPDATE Product 
SET Version = 2 /* The incremented version */,        
Name = 'UpdatedName',
Description = 'UpdatedDescription'
WHERE  Id = 'SomeUniqueIdXXXX'
AND Version = 1 /* The initial version */

第一次更新将成功,如果他们使用陈旧的版本,则同一行的下一次更新将失败。您的应用应该能够处理失败并按照您想要的方式进行(例如显示错误消息等)。如果您不想修改所有表以包含 Version 列,则可以使用下一种技术。基本上,您将所有原始值作为 where 子句的一部分:

UPDATE 
Product 
SET Name = 'UpdatedName'
WHERE Id = 'SomeUniqueIdXXXX'
AND Name = 'OriginalName'
AND Description = 'OriginalDescription'

如果您使用的是NHibernate,可以根据您设置映射的方式自动完成这些技术。