Здравствуйте. Возник такой вопрос.. Многопользовательская система. Ну к примеру доска объявлений, работает одновременно много пользователей. Может ли такое произойти что один пользователь получит lastInsert_id уже вставленной записи другим пользователем.
не может. это достаточно устойчивый к отказам механизм. полученный в результате выполнения вставки идентификатор хранится на уровне сеанса и не может быть выдан другому сеансу
Спасибо, с этим вроде всё ясно, вот что написано в доках по mySql: Вот ещё не ясность в похожей ситуации. Допустим есть некая система записи на приём (к врачу к примеру). Так же много пользователей. При создании записи происходит проверка - нет уже записи на это время, если записей на это время Ноль то происходит INSERT. Тот же вопрос не получиться ли дубля в БД, если если после проверки одним польз. произойдёт вставка другим пользователем. И повиснет в БД дубль на тоже время.
Хм, дело в том что всю проверку на уровне бд в нашем случае не получается сделать. Алгоритм такой: Мы сначала получаем записи по дате и длительности, далее в php небольшой цикл проверяет что бы даты и время не пересекались и не перекрывали друг друга, и только в этом случае происходит вставка, и за это время может произойти insert другим пользователем. INSERT LOW_PRIORITY - похоже тоже не вариант
Транзакция здесь не поможет, если нет уникальности по дате и периоду. Нужно делать или свой алгоритм блокировки (сложно, но быстро) или блокировать всю таблицу (медленно, но просто). Но в принципе, ТС не прав - в SQL можно написать проверку пересечения дат и периодов. Хотя проблема блокировки на время проверки (поиска НЕпересечения с имеющимися) всё равно остаётся. Моя рекомендация: если число записей в БД меньше 10 шт в секунду, используйте блокировку таблицы. А когда будет тормозить в этом месте - разберётесь в алгоритмах и переделаете.
Вот уже весь BETWEEN "замусолил" так и не получилось проверить пересечение дат и периода. Если не трудно приведите пример как в SQL запросе можно проверить пересечение по датам. Например, Таблица, в ней поля дата заезда date_in и дата выезда date_out И как без php - проверить что бы периоды: 1. Не пересекались 2. Между периодом вставляемой записи не было другого более маленького периода.
Ну обычным меньше больше проверить ну во у нас занято от 20 до 40 а ты хочешь проверить например от 35 до 105, > 35 и < 105 вот и обнаружили от 20 до 40
Да пробовал я, вариантов 1000 перебрал, и с <=<>=> и between - так и не понял странное поведение mySql. Дело в том что если проверять просто по датам - то всё норм. отрабатывает, но как только добавляешь дополнительный AND WHERE - например id_пользовтеля - то результат вообще нелогичный и вообще левые записи в результате. Весь инет перекопал уже по данному вопросу.
Плохо пробовали. MySQL очень даже предсказуем, за исключением нескольких мелких багов, которые почему-то не исправляются. Задавайте конкретные вопросы и возможно Вам помогут, а на сферические вопросы про сферического коня получите сферические ответы.
Давайте, я попробую объяснить мою проблему. Есть таблица в которую заносятся все записи, я не буду все поля перечислять - только ключевые. id - AI id_user id_box date_in (тип date) date_out (тип date) [/list:u] Допустим в таблице есть запись: date_in = 2105-10-15 date_out = 2015-10-25 При вставке новой записи мне нужно проверить что бы новый диапазон ни каким боком на наезжал на другие (уже имеющиеся), например: date_in = 2015-10-11 date_out = 2015-10-17 - заперещено date_in = 2015-10-16 date_out = 2015-10-20 - заперещено date_in = 2015-10-20 date_out = 2015-10-29 - заперещено date_in = 2015-10-10 date_out = 2015-10-30 - заперещено [/list:u] Вот sql: Код (PHP): SELECT `id` FROM `table` WHERE ('Новая date_in' BETWEEN `date_in` AND `date_out`) OR ('Новая date_out' BETWEEN `date_in` AND `date_out`) Но он не захватывает - если указать: Если новые даты будут: date_in = 2105-10-11 date_out = 2105-10-27 Чуть позже: Вот так вроде всё учитывает: Код (PHP): SELECT `id`, `box` FROM `orders` WHERE ('2015-10-01' BETWEEN `date_in` AND `date_out`) OR ('2015-10-31' BETWEEN `date_in` AND `date_out`) OR (`date_in` BETWEEN '2015-10-01' AND '2015-10-31') OR (`date_out` BETWEEN '2015-10-01' AND '2015-10-31') НО, если я укажу ещё: Код (PHP): AND `id_box` = 32 То sql это условие почему то не берёт во внимание. Он выдаст все и id_box = 32 и id_box = 56 итд. Почему так происходит? PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Код (PHP): SELECT `id`, `id_box` FROM `orders` WHERE (`id_box` = 32) AND ('2015-10-01' BETWEEN `date_in` AND `date_out`) OR ('2015-10-31' BETWEEN `date_in` AND `date_out`) OR (`date_in` BETWEEN '2015-10-01' AND '2015-10-31') OR (`date_out` BETWEEN '2015-10-01' AND '2015-10-31') PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Ой блин, вот я тупень, скобки нужны похоже. Так похоже нужно: Код (PHP): SELECT `id`, `id_box` FROM `orders` WHERE `id_box` = 32 AND ( ('2015-10-01' BETWEEN `date_in` AND `date_out`) OR ('2015-10-31' BETWEEN `date_in` AND `date_out`) OR (`date_in` BETWEEN '2015-10-01' AND '2015-10-31') OR (`date_out` BETWEEN '2015-10-01' AND '2015-10-31') ) PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Хм. наверное можно сократить запрос и до такого? Код (PHP): SELECT `id`, `id_box` FROM `orders` WHERE `id_box` = 34 AND ( ('2015-10-01' BETWEEN `date_in` AND `date_out`) OR ('2015-10-31' BETWEEN `date_in` AND `date_out`) OR (`date_in` OR `date_out` BETWEEN '2015-10-01' AND '2015-10-31') ) Chushkin А подскажите вкратце, пожалуйста такой алгоритм - принцип, ну или где почитать хотя бы можно. Спасибо. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Вы наступаете на те же грабли. Добавлено спустя 44 секунды: Сейчас Вам этого не нужно, не заморачивайтесь.
Между полями AND нужно Да, в том то дело, что нужно сразу изучать - что бы было время всё тщательно обдумать, ведь позже когда посыпятся ошибки - вникать в код, даже свой, и даже грамотно написанный - довольно унылое дело , хотя и при поддержке проектов почти всегда приходится. Вот тут в третьем абзаце "В РСУБД механизм..."(я его десять раз прочитал) http://kharchuk.ru/home/9-Прочее/53-mysql-transactions Я так понял что блокировка таблиц это и транзакция (более совершенный механизм) - это типа одно и тоже. Или я не понял... Вообще у нас механизм транзакций реализован на уровне абстракции и использование его в нашем решении - было бы большим плюсом...
Похоже вы эти грабли носите с собой Добавлено спустя 6 минут 16 секунд: Не правильно. Транзакции, они и в Африке транзакции. От движка к движку отличаются нюансами, но принцип один - атомарность операции. Блокировка таблиц к транзакции имеет косвенное отношение, может использоваться, может нет. Для mySQL читайте про LOCK TABLES.