2009-03-13 5 views
0

データベースから1000行を取得する必要がありますが、同時に「処理中」とタグ付けする必要があります。 この方法では、別のスレッドは同じ1000行を取得して処理することはできません。 LINQでlinqは原子的に更新してクエリできますか?

は、私はこのような何かを:

のMSG =(Mからdatabase.messages (m.status == MESSAGESTATUSINIT) 選択メートルで).Take(1000).ToList();

理想的には、私は同時にステータスをMESSAGESTATUSPROCESSINGに設定します。もちろん、これはアトミックでなければなりません。

それともSQLに戻っていますか?

ありがとうございました!

答えて

2

これはlinq2sqlでは実行できません。ストアドプロシージャを使用し、メッセージを出力するようにデザイナでコンフィグレーションします。この方法では、ロードされたエンティティを操作して、通常どおりに変更をコミットできます。それを行う方法については、この(特にデータモデルクラスにSPROCメソッドの戻り値の型のマッピング)

チェック: http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

+0

それは私もそれをやる方法です。 –

+0

素晴らしい!ありがとう! – Toad

0

コードをロック{}で囲むことができます。

Lock Keyword

+0

確かに、私も(さらには他のコンピュータ上の)他のプロセスをしたいこれらを取得しないために記録。 また、1つのアトミックSQL文で行うことができる場合、1000レコードをforeachして処理するように設定するのは愚かなようです。 – Toad

1

LINQの自体がこの機能を提供するつもりはありません。 Linq ==クエリを覚えておいてください。データの更新は他の場所で行われます。

このインスタンスでは、ストアドプロシージャを作成して結果を返す方がよい場合があります。 sprocはテーブルを更新して結果をアトミックに返すことができ、アプリケーションは1回の呼び出しを行います。

+1

linq2sqlは問合せだけでなく、このシナリオをサポートしていません。一部のブログではバッチ更新を行うカスタムメソッドがありますが、同時に結果セットは返されません。 – eglasius

関連する問題