0

この投稿は、私のこの投稿に多少関連しています: WCF サービスでデータベース アクセスを同期する方法は?

私がそこで得た回答は複雑すぎて\または矛盾していました... :(

サンプルの WCF サービスを作成し、それに対してクライアントの 3 つのインスタンスを実行しました。このサービスは、names と呼ばれる複数の行を持つ SQL テーブルと通信します。

1 つのクライアントがサービスで関数 1を生成します。

2 番目のクライアントは、サービスで関数 2を生成します。

function1は、次のサービスで関数を生成します。

を。特定の行を「Charlie」から「Chin」に変更します

b. 5秒待つ

c. 行を「Chin」から「Carol」に再度変更します

function2は、すべての名前のリストを返す関数を生成します。

サービスの両方の機能が「TransactionScope」でラップされていることに注意することが重要です。

私がすべきこと: function1を実行し('Charlie' を 'Chin' に変更して 5 秒間待機します)、すぐにfunction2を生成します。これは名前のリストを取得しようとしますが、ハングします ( function1がまだ終了していないため)。数秒後、function1は名前を 'Chin' から 'Carol' に変更し、その後初めてfunction2が解放され、名前のリストが返されます。

問題は、 function2から返される名前のリストに'Carol' が含まれていないことです。「チャーリー」が含まれています!どうしてこれなの ?function1が終了するまでfunction2がハングしたため、 function1が終了したときにのみデータを取得すると思いましたが、明らかにそうではありません。

私は何を間違っていますか?

システム全体の速度が低下するため、ロックの使用を開始したくありません。私は最終的なサービスで約 20 のメソッドを持ちますが、それらすべてでロックを使用する必要はありません... (「読み取り」用のメソッドは 3 ~ 4 個だけですが、それらは使用されるメソッドです 95 % の時間)...

4

1 に答える 1

0

これを行うには、最初のプロセスが完了するまで他のプロセスがデータを読み取れないように、変更中のデータをロックする必要があります。

これを行うには、TransactionScope を使用します。分離レベルをシリアライズ可能に設定します。これにより、データがロックされます。2 番目の呼び出しを待機させるために、読み取りでもデータを (同じ値に) 更新するように指定する必要がある場合があります。

http://msdn.microsoft.com/en-us/library/system.transactions.isolationlevel(v=vs.90).aspx

于 2012-04-17T18:15:58.407 に答える