两个线程同时添加新行 - 如何防止?

2 database multithreading

在我的应用程序中,我有几个执行某些逻辑的线程.最后,他们将新行添加到某个表中.

在添加新行之前,它们会检查先前具有相同详细信息的条目是否尚不存在.如果找到了 - 他们更新而不是添加.

问题是当一些线程A进行检查时,看到没有先前具有相同细节的实体,并且在他添加新行之前,线程B在DB中搜索同一实体.线程B看到没有这样的实体存在,所以他也添加了新的行.

结果是表中有两行具有相同的数据.

注意:没有违反表键,因为线程在添加行之前获得下一个序列,而表键是一些与数据无关的ID.

即使我将更改表键,因此它将是数据的组合,它将阻止具有相同数据的两行,但是当第二个线程将尝试添加行时将导致DB错误.

感谢你提前帮忙,罗伊.

Bor*_*vić 5

您应该使用队列,可能是阻塞队列。线程 A 和 B(生产者)将向队列添加对象,另一个线程 C(消费者)将轮询队列并从队列中删除最旧的对象,并将其持久化到数据库中。当 A 和 B 同时想要持久化相同的对象时,这将防止出现问题


fin*_*nnw 5

你说的是"行",所以这可能是一个SQL数据库?

如果是这样,为什么不使用交易呢?

(除非线程共享数据库连接,在这种情况下,互斥锁可能有所帮助,但我更愿意为每个线程提供单独的连接.)