Я понимаю, что Apache создает отдельный процесс PHP для каждого входящего запроса. Это означает, что если у меня есть код, который делает что-то вроде:Условия гонки с Apache, MySQL и PHP
- проверки, если запись существует
- , если запись не существует, создайте его
Тогда это восприимчивое к состоянию гонки, является не это? Если одновременно поступают два запроса, и оба они одновременно ударяют (1), они оба возвращаются в ложь, а затем обе пытаются вставить новую запись.
Если да, то как люди справляются с этим? Будет ли создание транзакции MySQL вокруг этих 2 запросов решить проблему, или нам нужно сделать полную блокировку таблицы?
INSERT IGNORE, LOCK TABLE или используя индекс UNIQUE в столбце, который вы не хотите дублировать, являются хорошими кандидатами. –
См. Также http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql –
'SELECT ...FOR UPDATE' –