1

我有多线程 C# WCF 服务器,其资源存储在数据库中。我正在使用 EF 访问数据库。

服务器正在处理来自许多工作人员的请求。工人以小组的形式联系在一起。每个组在数据库中都有自己的资源。某个组与另一个组共享一些资源。

所有请求都是关于资源的:同步、创建、更新、删除。

我有竞争条件的问题:如果工人 A 和 B 在同一个组中,工人 A 请求一些更新,然后 B 请求同步,并且 B 的请求将在 A 的请求结束之前开始和结束,那么工人 B 永远不会得到 A更新。

实体框架有什么方法可以进行原子操作get_and_increase_if吗?我想在数据库值上实现类似信号量的工具。

有没有其他方法可以解决这个问题?

同步由修订计数器完成。组有修订。创建/更新通过以下方式完成:

  1. Increase group revision()
  2. Set new/updated object revision to new group revision()

编辑:有许多资源类型,每种资源类型都在 db 中自己的表中。所以我不能只将下一个值设置为资源的修订版。

4

2 回答 2

1

如果您使用的是 SqlServer 2005 或更高版本:

UPDATE GroupRevisions SET Revision = Revision+1
OUTPUT INSERTED.Revision
WHERE GroupRevisionID = @Id
于 2012-09-14T13:28:37.820 回答
1

如果它是您需要的下一个修订号的计数器,您可以使用序列,请参阅:http: //msdn.microsoft.com/en-us/library/ff878091.aspx

如果它更复杂,您可以使用可序列化事务。

于 2012-09-14T10:38:51.413 回答