mysql插入竞争条件

标签 mysql locking transactions race-condition

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

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

然后要么你得到一个重复的行,要么如果你通过唯一/主键阻止它,一个错误。

现在通常我认为交易在这里有帮助,但因为该行不存在,交易实际上没有帮助(或者我遗漏了什么?)。

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/

相关文章:

c# - 在一个类中定义 MySqlConnection 并在另一个类中使用它来处理数据库

java - java中读/写变量的原子操作

Python 3.2 - GIL - 好/坏?

spring-boot - Spring Data JPA中为什么需要给Service类加上@Transactional注解

grails - PooledConnection 已关闭

sql - 通过 Hibernate 更新计数器

php - SQL服务器: stored procedure

mysql - 结合更新和限制操作的选择,

mysql - 使用 GROUP BY 获取合适的日期

ios - 锁定managedObjectContext