一尘不染

mysql插入竞争条件

mysql

如何停止MySQL中的竞争条件?当前的问题是由一个简单的算法引起的:

  1. 从表中选择一行
  2. 如果不存在,将其插入

然后会得到重复的行,或者如果您通过唯一/主键阻止它,则会出现错误。

现在,通常我认为事务在这里有所帮助,但是由于该行不存在,所以事务实际上并没有帮助(或者我是否错过了什么?)。

LOCK TABLE听起来有些矫kill过正,尤其是如果该表每秒更新多次。

我唯一想到的其他解决方案是对每个不同的id使用GET_LOCK(),但是没有更好的方法吗?这里也没有可伸缩性问题吗?而且,为每个表执行此操作听起来有点不自然,因为这对我而言在高并发数据库中听起来是一个非常普遍的问题。


阅读 240

收藏
2020-05-17

共1个答案

一尘不染

你想要的是锁表

或者,如果这看起来过多,那么通过检查是否已实际插入行来进行INSERT
IGNORE

如果使用IGNORE关键字,则在执行INSERT语句时发生的错误将被视为警告。

2020-05-17