1

データベースにリソースが格納されているマルチスレッドC#WCFサーバーがあります。EFでdbにアクセスしています。

サーバーは多くのワーカーからのリクエストを処理しています。労働者はグループでつながっています。各グループには、データベースに独自のリソースがあります。一部のグループには、別のグループと共有されているリソースがあります。

すべてのリクエストは、同期、作成、更新、削除などのリソースに関するものです。

競合状態に問題があります。ワーカーAとBが同じグループに属している場合、ワーカーAが更新を要求し、次にBが同期を要求し、Aの要求が終了する前にBの要求が開始および終了すると、ワーカー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 に答える