2012-09-14 18 views
1

我有多线程C#WCF服务器,资源存储在数据库中。 我正在用EF访问数据库。具有实体框架的多线程WCF服务器:事务和同步,争用条件

服务器正在处理来自许多工作人员的请求。 工人分组连接。 每个组在数据库中都有自己的资源。 某些组有一些资源与另一组共享。

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

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

有没有办法用实体框架来做原子操作,如get_and_increase_if? 我想在数据库值上实现类似于信号量的工具。

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

同步由修订计数器完成。 组已修改。

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

编辑: 创建/更新是通过做有很多资源类型,每一种在DB自己的表。所以我不能将下一个值设置为资源的修订版。

+1

也许是我的,但我觉得这个问题很模糊。你在谈论什么这些小组?你在说什么这个同步请求?为什么你的不同请求相互作用?为什么你不能用数据库事务解决这个问题? – Steven

+0

@Steven Worker要求同步,它有自己的修改。服务器只是检查是否有新的工作人员修订('如果worker.revision Ari

回答

1

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

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

+0

并不那么简单。我在许多不同的表格中有许多不同的资源。添加到问题。 – Ari

+0

然后,要走的路是使用隔离级别设置为可序列化的事务范围 –

+0

我想过,但我找不到方法1)从数据库中获取价值,2)增加它和3)设置一些其他对象的属性。 – Ari

1

如果您使用SqlServer的2005或以上:

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

我需要C#实体框架,而不是sql。 – Ari

+0

为什么?实体框架有直接调用sql的设施。更重要的是,你正在做一些复杂的事情,而且绝对不是内置到Entity Framework中的;这就是为什么这些设施在那里。 – JeffreyABecker

+0

也许,但我现在很难这样做。 – Ari