>我有一个.net API,它将在SQL表中执行Steoredproecure和Insert或更新几列。在 API 中,这在事务中运行。
RecordID 是此表中的主键,但"客户"和"日期"字段是唯一的组合,如果它已具有具有该组合的记录,则不应有重复的记录,而应更新该记录。
我们每天要插入近 6 到 7000 条记录。有时,API 调用 SP 两次,几乎相差一毫秒。我在SP中检查如下,
SELECT @RecordExist = Count(*)
FROM Records (nolock)
WHERE ServiceDate = @Date
AND CustomerAccount = @CustomerAccount
如果记录计数大于 0,则我正在更新它,否则插入。开始到结束它是在交易中。
不知何故,当请求同时出现多次时(每当用户更新记录并且有 5 分钟间隔的自动更新时,应用程序都会期望这样做(,上述 SP 检查无法找到记录并再次插入而不是更新记录。
数据库中有什么解决方案可以阻止这种重复吗?还是从 API 保留,直到检查完成,然后发送到更新?
如果您不太关心更新顺序,那么SQL MERGE将解决您的问题。
合并将自动插入或更新。
合并在客户和日期 - 匹配时 - 更新 当与目标插件不匹配时
应该做这个伎俩。