具有实体框架的多线程WCF服务器:事务和同步,竞争条件

时间:2012-09-14 09:38:48

标签: c# wcf visual-studio entity-framework race-condition

我有多线程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()
  3. 编辑:有许多资源类型,每个资源类型都在db中自己的表中。所以我不能只将下一个值设置为资源修订版。

2 个答案:

答案 0 :(得分:1)

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

如果它更复杂,你可以使用可序列化的交易。

答案 1 :(得分:1)

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

UPDATE GroupRevisions SET Revision = Revision+1
OUTPUT INSERTED.Revision
WHERE GroupRevisionID = @Id