在我的应用程序中,我有几个执行某些逻辑的线程.最后,他们将新行添加到某个表中.
在添加新行之前,它们会检查先前具有相同详细信息的条目是否尚不存在.如果找到了 - 他们更新而不是添加.
问题是当一些线程A进行检查时,看到没有先前具有相同细节的实体,并且在他添加新行之前,线程B在DB中搜索同一实体.线程B看到没有这样的实体存在,所以他也添加了新的行.
结果是表中有两行具有相同的数据.
注意:没有违反表键,因为线程在添加行之前获得下一个序列,而表键是一些与数据无关的ID.
即使我将更改表键,因此它将是数据的组合,它将阻止具有相同数据的两行,但是当第二个线程将尝试添加行时将导致DB错误.
感谢你提前帮忙,罗伊.
您应该使用队列,可能是阻塞队列。线程 A 和 B(生产者)将向队列添加对象,另一个线程 C(消费者)将轮询队列并从队列中删除最旧的对象,并将其持久化到数据库中。当 A 和 B 同时想要持久化相同的对象时,这将防止出现问题
你说的是"行",所以这可能是一个SQL数据库?
如果是这样,为什么不使用交易呢?
(除非线程共享数据库连接,在这种情况下,互斥锁可能有所帮助,但我更愿意为每个线程提供单独的连接.)