Это то, что мне никогда не удавалось овладеть, и хочу знать, правильно ли я делаю это правильно и проверяю его.Запирание таблицы MySQL (прочитано)
....
У меня есть база данных links
, позволяет сохранить его простым, 2 колонки
ID int(10) PK, Status enum('ready', 'in progress', 'complete'); 1 'ready' 2 'ready' 3 'ready'
....
Я тогда есть API, что при запросе возвращает Идентификатор «готового» элемента, этот API можно было бы назвать много раз одновременно, и я хочу, чтобы идентификатор выдавался только один раз.
....
API MySQL запросов ..
LOCK TABLES `links` WRITE SELECT ID FROM links WHERE status = 'ready' LIMIT 1 // gets a ready one UPDATE links SET status = 'in progress' WHERE ID = 'X' // updates the one just got from line above to be in progress (so not selected by another API call UNLOCK TABLES
Таким образом, если два API вызовы ударил его 0,01 секунды друг от друга, первое нужно заблокировать таблицы обновлять его в процессе, после разблокировки второй получает шанс, и делает то же самое, но выбирает другой идентификатор, который получил первый.
Это правильно? или лучший способ сделать такую вещь? Поскольку это вызывает длительные задержки на трафике MySQL с некоторыми запросами, ожидающими 5 минут или около того, а затем MySQL поражает максимальные соединения и вызывает всевозможные другие проблемы.
Таблица InnoDB и относительно небольшая с примерно 165 тыс. Строк, с индексом статуса, заблаговременно за любые советы или указатели.
Являются ли идентификаторы уникальными, т.е. созданы с каждым посетителем или установлены и назначены посетителю? – jeff
Нет, это просто база данных, заполненная уникальными идентификаторами, и каждый вызов API должен давать другой идентификатор, а не обманывать. – blackout2063