我想问一下下面的代码是否是线程安全的:
考虑 Save1 和 Save2 将同时执行。数据上下文的线程安全有问题吗?

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);
        }
    }
}

提前致谢

最佳答案

Thread safe doesn't really mean anything without context 。您需要更详细地说明您认为可接受和 Not Acceptable 内容。在您的特定情况下,因为每个方法都有一个单独的数据上下文,所以您无需担心其中一个插入“在”另一个插入的“中间”,或者以其他方式导致其中一个完全失败由于对共享资源的非同步访问(如果数据上下文在线程之间共享,这可能是一个问题)。

然而,插入的顺序是完全不确定的。如果这些操作的顺序很重要,那么它就“不是线程安全的”。

此外,如果您正在执行包含“事务”的多个操作,则它可能是也可能不是“线程安全的”,具体取决于您定义线程安全的方式。如果每个方法都插入了 5 个项目,则您无法确定所有五个插入都是在其他方法插入之前或之后(除非您明确添加了 lock 以确保这一点)。

关于c# - LINQ To SQL 线程安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13037470/

10-14 11:52
查看更多