C# 如何防止使用多线程插入重复值

C# 如何防止使用多线程插入重复值,c#,mysql,multithreading,C#,Mysql,Multithreading,我开发了一个多线程应用程序,可以在数据库中插入一些数据。 假设我有以下情况: public void Foo() { Task.Factory.StartNew(() => AddTeams()); Task.Factory.StartNew(() => AddTable()); } 正如您所看到的,我调用了两种不同的方法将数据插入数据库,问题是每个方法都需要检查特定表中是否存在特定记录: public void AddTeams() { //Pseudo

我开发了一个多线程应用程序,可以在数据库中插入一些数据。 假设我有以下情况:

public void Foo()
{
    Task.Factory.StartNew(() => AddTeams());
    Task.Factory.StartNew(() => AddTable());
}
正如您所看到的,我调用了两种不同的方法将数据插入数据库,问题是每个方法都需要检查特定表中是否存在特定记录:

public void AddTeams()
{
    //Pseudo code:
    //Check if a team with id 1249 exist in the table team
    //if not exist in the table team, insert the team with id 1249
    //then insert the record attached with an `FK` to the team table.
}
同样的事情也发生在
AddTable
上,因此有时会出现以下错误:

“主键”的“重复条目”1249

因为在
AddTable
方法上检查失败,所以失败的原因是我使用的并行化,总结一下:时间问题

我该怎么办


我想到的唯一方法是处理异常,但我不喜欢这种方法。

您只需不并行化查询即可获得团队并在必要时创建它。你不想或不需要做两次,一开始只需要做一次。因此,获取或创建团队,获取该团队的主键,然后将其传递给这两个方法,每个方法创建一个相关对象,这可以并行完成。

使服务成为单线程,处理异常,或者将逻辑包装到一个能够优雅地执行插入操作的存储过程中。@DanWilson包装过程应该如何工作?从您正在使用的事实开始,通过您不仅使此代码异步,直到您正在为一次运行任务添加线程管理开销:这闻起来真糟糕。可能是X-Y问题。你想干什么(或者有人告诉你必须干什么?@MarcL。任务被封装在foreach中,这就是为什么我需要分流多个线程。主要问题是:如何使用多线程处理记录复制(防止上述错误)?@utop这不是多线程的原因。