[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Одновременная данных в mysql несколькими скриптами
SnowWind
Привет, проблема такая, в cron добавлено 10 скриптов, которые пишут в базу данные раз в минуту, проблема в том, что получается путаница, если они запускаются одновременно, при подобных вставках
INSERT INTO `volume` (`exid`, `date`, `volume`) VALUES ((SELECT max(`id`) FROM `name`),
они одновременно принимают параметр max(`id`) и получаются одинаковые значения, решил сделать так

$randsleep = rand(1000, 10000);
while(file_exists('stopparsing.txt')){usleep($randsleep);}
file_put_contents('stopparsing.txt', '');
....
Запись в базу......
unlink('stopparsing.txt'); usleep($randsleep);


Думал, будет работать что-то на подобии лок файла, но всё равно почему-то происходит одновременная запись одинаковых значений, как можно это решить?
AllesKlar
id должкен быть уникальным, первичным ключем и AUTO_INCREMENT
после этого, в запросе вставлять id не нужно, база будет сама его автоматически создавать

CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);


INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
(
'lax'),('whale'),('ostrich');

SELECT * FROM animals;


_____________
[продано копирайтерам]
SnowWind
Так дело в том, что у меня несколько таблиц, таблица с товаром, ценами и объёмами

ну вот в таблице name происходит вставка товара с AUTO_INCREMENT, а затем вставка в таблицу volume с где в поле exid вставляется значение max(`id`) таблицы name VALUES ((SELECT max(`id`) FROM `name`
AllesKlar
Меняй логику.
В таблицу товаров ты вставил товар. Назад ты получил last_index_id
И этот last_index_id (name) ты и вставляешь в поле exid таблицы volume

_____________
[продано копирайтерам]
SnowWind
А почему конструкция с файликом не работает, он же вроде должен тормозить следующий скрипт, который пытается произвести запись в базу
AllesKlar
Цитата
в cron добавлено 10 скриптов,
...они запускаются одновременно,


У тебя стартануло одновременно 10 скриптов.
Каждый посмотрел: file_exists // false
file_exists работает быстро
file_put_contents работает медлено

делай вывод в лог, смотри error.log
То, что ты написал a b c еще не означает, что и a и b и c выполнятся успешно.
Пиши в лог, когда скрип проверил file_exists, когда закончилось file_put_contents, удачно ли file_put_contents завершился, когда следующий проверил file_exists и все будет ясно.
Только не понятно, зачем такой геморой, когда можно все сделать по-уму, без блокировок на фалах.

_____________
[продано копирайтерам]
SnowWind
А какая разница с LAST_INSERT_ID() и SELECT max(`id`) FROM `name`?
Суть одна и та же ведь получается
chee
SnowWind, учи матчасть https://ru.wikipedia.org/wiki/%D0%A3%D1%80%...%86%D0%B8%D0%B9


https://phpclub.ru/mysql/doc/innodb-transaction-model.html

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
walerus
SnowWind
Цитата
какая разница с LAST_INSERT_ID() и SELECT max(`id`) FROM `name`?

Немного разная суть, LAST_INSERT_ID - возвращает ID только что вставленного элемента, а SELECT max(`id`), выдаст максимальное значение ID в таблице...

НО!, у LAST_INSERT_ID - есть "подводные камни", например, одним запросом вставляется 5ть записей сразу, после ID=3 ... так вот LAST_INSERT_ID вернет 4, не посчитав вставленных 5ть записей, т.е. один запрос - один ответ, никаких мультизапросов, а SELECT max(), вернет - 8,
НО !!! это при условии если все хорошо и больше запросов не было, что в твоем случае НЕ так.

Тебе ]AllesKlar[/b] правильно подсказал, использовать нужно - LAST_INSERT_ID(правда он ее обозвал last_index_id cool.gif ), т.е. один запрос === один ответ.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.