@svm

Как запретить одновременное выполнение определенного участка кода при нескольких одновременных подключениях?

Я не знаю как правильно спросить у гугла, но уверен, что ответы уже есть.
В общем, суть следующая. Есть скрипт php (определенный участок), этот скрипт работает с базой данных. Данный скрипт добавляет данные в таблицы, если этих данных не существует. Само собой настроены связи у таблиц, в том числе и множественные.
Дело в том, что иногда добавляются дубликаты этих данных при одновременном подключении и добавлении одинаковых данных. Первое подключение видимо проверяет, что данные не существуют и принимает решение добавить в то время, когда второй начал эти данные проверять ну и тоже принимает соответствующее решение.
Я думал, что мне помогут транзакции, но не тут то было. После того, как я их настроил, стало только хуже.
Добавляются абсолютно все данные. Первое подключение пока проверяет и добавляет все данные, второе подключение делает то же самое, так как первое ещё не сделало свой commit и результаты всей работы не отражены.

Как правильно поступить в моем случае? Я пытаюсь что-то узнать у гугла, но толком ничего не нашел, кроме SyncMutex.
Если честно, даже не знаю то ли это и как оно работает вообще.
В моем понимании как-то бы заблокировать работу определенного участка кода, пока не выполнился этот же участок кода в другом подключении, но как это сделать - я не знаю.
Тип таблиц innodb, если что.
Подключение к базе ведется посредством PDO.
  • Вопрос задан
  • 212 просмотров
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Это частая ошибка новичков, которые путают транзакции с блокировками.
Тебе нужно последнее

вот так и формулируй - как заблокировать таблицу на чтение
а не какой-то абстрактный "участок кода"
Ответ написан
@Vitsliputsli
По-моему самое простое и правильное решение здесь - insert ignore, другой вариант транзакции с блокированием таблицы, но это может сильно ударить по производительности.
Ответ написан
profesor08
@profesor08 Куратор тега PHP
Классика. Делай проверку на SQL.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы