【发布时间】:2018-02-03 11:43:15
【问题描述】:
在 MySQL 中向表中插入数据时会发生争用情况。我检查没有重复的键,但有时还有另一个 PHP 线程在做同样的事情:
DEBUG - 2018-02-03 03:40:41 --> [9GH212VT] SELECT * FROM `device_cache` WHERE `md5sum` = '4fd43e58b0a538a0d97e4b8074b0aa80'; - 7.2002410888672E-5
DEBUG - 2018-02-03 03:40:41 --> [DLZ6FPAE] INSERT INTO `device_cache` (`md5sum`, `user_agent`, `data`) VALUES ('4fd43e58b0a538a0d97e4b8074b0aa80', '...'); - 0.10529589653015
ERROR - 2018-02-03 03:40:41 --> [QCSUMNJ5] Query error: Duplicate entry '4fd43e58b0a538a0d97e4b8074b0aa80' for key 'PRIMARY' - Invalid query: INSERT INTO `device_cache` (`md5sum`, `user_agent`, `data`) VALUES ('4fd43e58b0a538a0d97e4b8074b0aa80', '...')
我想知道我是否能捕捉到这个错误,Codeigniter 发现这个错误时终止执行。
【问题讨论】:
-
如果您对键执行选择并返回结果然后执行更新,否则执行插入。
-
@TimBrownlaw 如果存在则不需要插入它,但是存在竞争条件,即在用于检查它是否存在的选择之后和插入之前插入一行(由其他进程) .
-
那么其他进程需要使用lock查询的事务。
标签: sql database codeigniter codeigniter-3 race-condition