@svm

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
от 80 000 до 100 000 ₽
ROIburo Екатеринбург
от 60 000 до 100 000 ₽