【问题标题】:How to prevent race condition with INSERT?如何使用 INSERT 防止竞态条件?
【发布时间】:2013-02-14 03:41:06
【问题描述】:

在向不包含唯一索引的表中插入一行时,我将如何防止竞争条件。例如说我的桌子是....

key | slot | label
------------------
 1  |  1   | some
 1  |  2   | some
 2  |  1   | some
 2  |  2   | some

... 是防止这种竞争条件创建复合唯一字段(例如“key:slot”)的唯一方法

id  | key | slot | label
------------------------
1:1 |  1  |  1   | some
1:2 |  1  |  2   | some
2:1 |  2  |  1   | some
2:2 |  2  |  2   | some

...或者有没有更有效的方法让我逃脱了?如果我要在执行插入后检查重复的行并在找到时回滚事务怎么办?

【问题讨论】:

    标签: mysql sql pdo innodb race-condition


    【解决方案1】:

    实际上你可以在没有key:slot 列的情况下做到这一点。您可以在表上定义唯一的复合键。例如,

    ALTER TABLE tableName ADD CONTRAINT tb_uq UNIQUE (`key`, slot)
    

    【讨论】:

    • 太好了,我不知道这是可能的,但看起来是理想的解决方案,谢谢 :)
    • 快速跟进,我之前在“key”上有一个非唯一索引,我认为它不再使用?
    • 它仍将用于搜索:D
    • 知道了,所以约束是一个约束,而不是实际的搜索索引。再次感谢:)
    • 如果您在(key, slot) 上有索引,则单独在key 上的索引不是必需的,因为它可用于搜索。但是,如果您仅在 slot 上有一个索引,则应该保留它,因为它不是新索引的前缀。
    【解决方案2】:

    如何在插入时使用LOCK TABLES 语法来防止竞争条件?

    【讨论】:

    • 我对锁定整个表的担忧是,有问题的表会被大量读取,我不确定这会对性能产生多大影响?
    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2016-12-10
    相关资源
    最近更新 更多