1
static Object LockEx=new Object();
public void SaveMyData(IEnumerable<MyData> list)
    {
        lock (LockEx)
        {
            using (PersistencyContext db = new PersistencyContext())
            {
                foreach (var el in list)
                {
                    try
                    {
                        db.MyData.Add(el);
                        db.SaveChanges();
                    }
                    catch (DbUpdateException)
                    {
                        db.Entry(el).State = EntityState.Modified;
                        db.SaveChanges();
                    }
                }
            }
        }

    }

このメソッドは、複数のスレッドから呼び出されます。現在、静的ロックを使用して、2 つのスレッドが同時にデータを保存するのを回避しています。データを保存したいだけなので、これは間違っていますが。エントリが既に存在するために挿入 (追加) が失敗した場合に備えて、catch を使用して更新クエリを作成します。

ロックを解除するとどうなりますか。作品はどうなるSaveChanges?私のコードはどのように見えるべきですか? ありがとう

4

2 に答える 2

2

データベースは設計上、とにかく並行性をすでに処理しているため、ロックを解除します。次に、レコードを追加する前に、レコードが存在するかどうかも確認し、この結果に応じて追加または更新を行います。彼らはパフォーマンスキラーであるため、例外を避けるためだけに。

于 2011-02-23T09:49:54.973 に答える
1

Davide の回答に基づいて、すべての新しいエンティティを追加した後に SaveChanges を呼び出すこともできます。その方が速いはずです。

于 2011-10-30T20:22:29.360 に答える