2009-06-19 7 views
0

私はLINQ to SQLを使用しており、ビューカウンタの相互接続を増やす問題が少しあります。LinqのSql非同期更新へのChangeConflictException

私が使用しているコードのちょっぴりです:私のテストで今

t = this.AppManager.ForumManager.GetThread(id); 
t.Views = t.Views + 1; 
this.AppManager.DB.SubmitChanges(); 

、私は非同時に、この複数回実行しています。このテストを実行しているオブジェクトの合計4つのコピーがあります。

つまり、ロックの問題などはありませんが、4つのデータコンテキストがあります。

これは、次のように動作すると思います。行をフェッチし、フィールドを変更し、行を更新します。しかし、これはChangeConflictExceptionをスローしています。

これのコピーが同時に実行されていないと、変更が矛盾するのはなぜですか?

特定のテーブルで変更の競合を無視する方法はありますか?

EDIT:答えが見つかりました:

あなたはアップデートの最後のイン・勝利のスタイルを作成するには、テーブル上のすべてのカラムに「UpdateCheck =決して」を設定することができます。これはLINQに移植する前にアプリケーションが使用していたものなので、ここでこれを使用します。

EDIT2:上記の私の修正が実際にスローされることから例外を防ぐためでしたが、それは根本的な問題を解決しませんでした:私は1つのデータコンテキスト以上のものを持っているので

、複数のキャッシュされているが終わります各オブジェクトのコピー。すべてのページの読み込み時にデータコンテキストを再作成する必要がありますか?

私はむしろすべてを忘れるようにデータコンテキストに指示します。これは可能ですか?

答えて

2

私は、DataContextが比較的軽量で短命にインデントされていると信じています。 IMOでは、必要以上に長いDataContextでロードされたデータをキャッシュしないでください。短命の場合、DataContextのメモリ使用量は主に、それによって管理されるオブジェクトに対する変更(それによって取得される)を追跡することに関連するため、比較的小さいままです。

私が取り組むアプリケーションでは、コンテキストを作成し、UIにデータを表示し、ユーザーの更新を待ってからデータを更新します。しかし、これは主に、ユーザーが何を参照しているかに基づいて更新を行いたい場合に必要です(そうしないと、ユーザーが更新プログラムにヒットしたときにデータを取得して一度に更新できます)。あなたの更新が比較的自立しているなら、私はそれを更新する直前に行を取り出すことが賢明だろうと思います。

System.Data.Linq.DataContext.Refresh()を使用して、既に取得したデータをデータベース内のデータと再同期して、この問題を解決することもできます。

コンテキストをすべて忘れてしまったというあなたの最後のコメントに答えるために、私はそれを行う方法はないと思うが、コンテキストにあるのは追跡された変更(および接続)実際にはコンテキストがあるすべてのものを捨てたいので、新しいコンテキスト(古いものを処理することを忘れないでください)を作成することも同様です。

関連する問題