【问题标题】:unique key exception on multiple inserts/updates多次插入/更新的唯一键异常
【发布时间】:2017-05-04 09:27:21
【问题描述】:

我的应用程序接收来自外部来源的多个请求(来自销售点单位的发票)。它每秒收到数十个请求,其中一些请求是相同的(具有相同的请求正文)。

请求数据被转换并保存到两个关联的表中(外键)。如果记录已经存在(通过唯一复合键查询),则更新记录,否则添加记录。

问题是,有时如果同时收到两个具有相同正文的请求,应用程序会抛出唯一键已经存在且无法插入的异常:

 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry

这可能是 MySQL 中的某种竞争条件,但无法弄清楚

整个过程都包裹在 Laravel 事务中。我尝试设置不同的隔离级别。 SERIALIZABLE 解决了这个问题,但是我得到了很多死锁异常,而且我可以看到有时记录根本没有保存。

【问题讨论】:

    标签: php mysql laravel unique isolation-level


    【解决方案1】:

    这很简单,这里发生了什么,你有一些值声明为“UNIQUE”或“主键”或类似的东西,你试图再次插入,一些键限制它阻止了插入,这应该很好,您可以避免数据库中出现重复条目​​,但是您需要检查数据库中是否存在您尝试插入的数据,而不是所有列,您应该询问您的键或组合键,我不能如果我不知道数据或表格,请帮助您更多...

    【讨论】:

    • 除了这部分之外的好答案“但是您需要检查您尝试插入的数据是否存在于数据库中,”这是错误的。正确的做法是让数据库处理,然后捕获抛出的异常。
    • 你是对的,如果它有很多数据,这可能需要很长时间,来回检查,可能只是他遇到这个问题的几次,一些简单的解决方案可能是laracasts.com/discuss/channels/eloquent/…
    • @aasanchez 正如我在我的问题中所写,如果记录存在,它已更新,我已经检查记录是否存在。但我认为发生了某种竞争条件,并且尝试同时插入两条相同的记录,检查以某种方式被跳过...
    • 正如我提到的我的评论,事先检查是完全错误的。正确的方法是捕获异常。
    • 但我必须检查,因为如果已经存在我需要更新记录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多