【发布时间】:2017-05-04 09:27:21
【问题描述】:
我的应用程序接收来自外部来源的多个请求(来自销售点单位的发票)。它每秒收到数十个请求,其中一些请求是相同的(具有相同的请求正文)。
请求数据被转换并保存到两个关联的表中(外键)。如果记录已经存在(通过唯一复合键查询),则更新记录,否则添加记录。
问题是,有时如果同时收到两个具有相同正文的请求,应用程序会抛出唯一键已经存在且无法插入的异常:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
这可能是 MySQL 中的某种竞争条件,但无法弄清楚
整个过程都包裹在 Laravel 事务中。我尝试设置不同的隔离级别。 SERIALIZABLE 解决了这个问题,但是我得到了很多死锁异常,而且我可以看到有时记录根本没有保存。
【问题讨论】:
标签: php mysql laravel unique isolation-level