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

g0czyy6m  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(347)

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

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 ,所以有时我会遇到这样的错误:
键“primary”的“duplicate entry”1249
因为检查失败了 AddTable 方法,失败的原因是我使用的并行化,总结一下:一个时间问题。
我该怎么办?
我想到的唯一方法是处理异常,但我不喜欢这种方法。

dy2hfwbg

dy2hfwbg1#

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

相关问题