この投稿は、私のこの投稿に多少関連しています: 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 % の時間)...