WCFサービスに関する簡単なクエリ
-
16-09-2019 - |
質問
2つの方法が公開されているWCFサービスがあります。
注:WCFサービスとSQLサーバーは同じマシンに展開されます。 SQL Serverには、従業員情報を維持する従業員と呼ばれるテーブルが1つあります。
- 読み取り()このメソッドは、SQL Serverからすべての従業員を取得します。
- write()このメソッドは、従業員テーブルに従業員情報をSQL Serverに書き込み(追加、更新、削除)します。
これで、Webサービスを消費して従業員情報をクエリ、追加、更新、削除できるデスクトップベースのアプリケーションを開発しました。
質問:
Mulitpleクライアントが従業員情報を同時に更新したい場合、シナリオを処理するにはどうすればよいですか? SQL Server自体は、データベースロックを使用してこれを処理していますか?
最良のアプローチを提案してください!!
解決
一般的に、切断された環境で 楽観的な同時性 とともに rowversion
/timestamp
好ましいアプローチです。 WCF します 分散トランザクションをサポートしますが、それはシステムに長いブロックを導入する素晴らしい方法です。ほとんどのORMツールがサポートします rowversion
/timestamp
すぐにボックス。
もちろん、 サーバ トランザクションを使用することをお勧めします(接続ベースまたは TransactionScope
)個々のリポジトリメソッドを「酸」にするためには、可能な限りワイヤー上のトランザクションを避けようとします。
コメント;申し訳ありませんが、正直なところ、それらのコメントは見られませんでした。一度に多くのコメントを受け取った場合、StackOverFlowがこれを簡単にしない場合があります。ここには2つの異なる概念があります。待機はブロッキングの症状ですが、100人のクライアントが同じレコードを更新している場合、各トランザクション中にブロックすることが完全に適切です。物事をシンプルに保つために:ボトルネックを実証できない限り(余分な作業が必要です)、私は シリアル化可能 更新操作を中心にトランザクション(TransactionScope
これをデフォルトで使用します)。そうすればはい:ほとんどのシナリオで適切なブロッキング(酸など)が得られます。
でも; 2番目の問題は並行性です。同じレコードの100の更新を取得した場合、どちらを信頼するかをどのようにして知ることができますか?ほとんどのシステムは 最初 データに関する古い仮定で動作しているため、残りを更新し、破棄します。これは、タイムスタンプ/rowぎが始まる場所です。「タイムスタンプ/rowヴァーバージョンが一致する必要がある」という更新ステートメントを実施することにより、スナップショットを取得してから変更されていないデータのみを更新できるようにします。この目的のために、Rowversionを一緒に保持することは一般的です 面白い 更新しているデータ。
他のヒント
もう1つの選択肢は、WCFサービスをSingleton(InstanceContext.Single)としてインスタンス化できることです。つまり、実行中のインスタンスは1つだけです。次に、更新ロックを目的としてシンプルなオブジェクトをメモリに保持し、そのオブジェクトに基づいて更新方法をロックできます。更新コールが他のセッションから送信されると、ロックがリリースされるまで待つ必要があります。
よろしく、スティーブ