如何停止 MySQL 中的竞争条件?手头的问题是由一个简单的算法引起的:
- 从表格中选择一行
- 如果不存在,则插入
然后要么你得到一个重复的行,要么如果你通过唯一/主键阻止它,一个错误。
现在通常我认为交易在这里有帮助,但因为该行不存在,交易实际上没有帮助(或者我遗漏了什么?)。
LOCK TABLE 听起来有点矫枉过正,尤其是当表每秒更新多次时。
我能想到的唯一其他解决方案是针对每个不同的 ID 使用 GET_LOCK(),但是没有更好的方法吗?这里也没有可扩展性问题吗?而且,对每个表都这样做听起来有点不自然,因为对我来说这听起来像是高并发数据库中的一个非常普遍的问题。
最佳答案
你想要的是LOCK TABLES
或者如果这看起来有点过分,INSERT IGNORE 怎么样?检查是否实际插入了该行。
If you use the IGNORE keyword, errors that occur while executing the INSERT statement are treated as warnings instead.
关于mysql插入竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/264807/