Потокобезопасность LINQ to SQL


Я хочу спросить, является ли следующий код потокобезопасным: Учтите, что Save1 и Save2 будут выполняться одновременно. Есть ли какие-либо проблемы с потокобезопасностью datacontext?

public class Test1()
{
    private void Save1()
    {        
        using(TestLinqToSQL obj = new TestLinqToSQL())
        {        
             obj.SaveRecord(new Client (){Id = 1, Name = "John Doe");
        }
    }

    private void Save2()
    {        
         using(TestLinqToSQL obj = new TestLinqToSQL())
         {        
             obj.SaveRecord(new Client (){Id = 2, Name = "Mike Tyson");
         }
    }         
}



public class TestLinqToSQL : IDisposable
{
    public void SaveRecord(Client newClient)
    {
        using(ClientDatacontext cont = new ClientDatacontext())
        {
            cont.InsertRecord(newClient);
        }        
    }
}

Заранее спасибо

2 3

2 ответа:

Потокобезопасность на самом деле ничего не значит без контекста. Вам нужно быть гораздо более подробным о том, что вы считаете приемлемым и неприемлемым. В вашем конкретном случае, поскольку у вас есть отдельный контекст данных для каждого метода, вам не нужно беспокоиться о том, что одна из вставок находится "в середине" другой вставки или каким-либо другим способом вызывает полный отказ одной из них в результате несинхронизированного доступа к общему ресурсу (это потенциально может быть проблемой, если вы не можете выполнить эту операцию). контекст данных был разделен между потоками).

Однако порядок вставок совершенно не определен. Если порядок этих операций имеет значение, то это "не потокобезопасно".

Кроме того, если вы выполняли несколько операций, которые включали "транзакцию", она может быть или не быть "потокобезопасной" в зависимости от того, как вы определяете потокобезопасность. Если каждый метод вставлял 5 элементов, вы не могли быть уверены, что все пять вставок были либо до, либо после другого метода. вставки (если вы явно не добавили lock для обеспечения этого).

В этом случае нет, это не проблема, так как каждый поток получит отдельный экземпляр DataContext, поскольку каждый метод приводит к созданию нового. Вы бы столкнулись с проблемой, если бы DataContext был разделен между потоками, поскольку методы экземпляра не являются потокобезопасными см. MSDN