我知道这个问题可以使用列上的唯一键约束和一些插入命令变体来解决。
但我到底想知道为什么下面的方法有时会出错并添加重复条目:
- 在列中检查了一个值
- 如果记录返回 > 0 则发出更新,否则简单插入命令
大多数时候它都有效。可以说98%以上,但为什么有时会失败呢?
我只想了解这种方法的故障在哪里,因为首先检查记录是否存在。
我知道这个问题可以使用列上的唯一键约束和一些插入命令变体来解决。
但我到底想知道为什么下面的方法有时会出错并添加重复条目:
大多数时候它都有效。可以说98%以上,但为什么有时会失败呢?
我只想了解这种方法的故障在哪里,因为首先检查记录是否存在。
这会失败的一种情况取决于您在时间上有多忙(或不幸)。
这完全是时间问题(正如您 98% 的作品所建议的那样)。您可以
WRITE LOCK
在要插入的表上和要更新值的表上为会话 A 获取一个,这将阻止会话 B,直到会话 A 释放锁。或者,您可以继续让数据库通过创建 UNIQUE INDEX 并发出INSERT .. ON DUPLICATE UPDATE自动处理锁定(推荐)