Можно ли ставить запросы клиентов в очередь на доступ к базе данных в MySQL. Я пытаюсь сделать это для управления параллелизмом. Блокировки MySQL можно использовать, но почему-то я не могу получить желаемый результат.

Фактически то, что я пытаюсь сделать, это:

  • ВСТАВИТЬ что-то в новую строку
  • ВЫБЕРИТЕ столбец из этой строки
  • Сохраните это значение в переменной

Проблема возникает, когда два разных клиента выполняют INSERT одновременно, поэтому переменные для обоих клиентов сохраняют значение последнего INSERT.

Я работал со следующей альтернативой, но она не удалась в нескольких тестовых прогонах, и ошибка совершенно очевидна:

  • ВСТАВИТЬ
  • ЗАМОК Таблица
  • ВЫБРАТЬ
  • хранить
  • РАЗБЛОКИРОВАТЬ

Благодарность!

0
check123 11 Апр 2011 в 18:04
2
Почитайте о транзакциях в MySQL, это то, что вам нужно, чтобы решить вашу проблему. Обратите внимание, что вы не подумали о том, что произойдет, если ваш INSERT по какой-то причине не сработает.
 – 
Michael J.V.
11 Апр 2011 в 18:15
Предположим, что все работает так, как ожидалось. Конечно, ваша точка зрения верна, но я хотел бы заняться этим, как только это будет сделано.
 – 
check123
11 Апр 2011 в 18:51
1
Я действительно не вижу причин, почему бы не использовать транзакции здесь, все, что вам нужно, соответствует тому, для чего были сделаны транзакции. Вы выдаете запросы, которые либо должны быть выполнены успешно (все они), либо ничего не происходит (вы нарушите целостность данных). Все, что предлагает MySQL, доступно во время транзакций (например, last_insert_id(), как предлагалось ранее). Подумайте об этом, прежде чем отказываться от этой идеи, в долгосрочной перспективе может оказаться разумным сделать ваши данные безопасными, а не подвергать их риску.
 – 
Michael J.V.
11 Апр 2011 в 19:00
Ой! Я позаботился о сбоях INSERT. И да, верно подмечено, Транзакции - это решение, как я мог забыть! Я могу просто вложить несколько запросов в транзакции. Спасибо!
 – 
check123
11 Апр 2011 в 19:05
Привет! Просто опубликуйте свой ответ как ответ, чтобы я мог принять его. С другой стороны, возможно ли в любом случае поставить в очередь доступ к SQL в PHP?
 – 
check123
11 Апр 2011 в 19:07

1 ответ

Я думаю, что у вас есть столбец с автоинкрементом и вы хотите получить его значение после вставки строки. Один из вариантов — использовать LAST_INSERT_ID() (подробности здесь и здесь).

Если это не применимо, пожалуйста, опубликуйте более подробную информацию. Что именно вы пытаетесь сделать и какие запросы выполняются?

2
nikhil500 11 Апр 2011 в 18:12
Первичный ключ действительно является AUTO_INCREMENT, но тот, который я получаю, является TIMESTAMP. Итак, скажем, 2 клиента одновременно подключаются к серверу, первый ВСТАВЛЯЕТ в ГГГГ-ММ-ДД ЧЧ:ММ:СС, а второй - в ГГГГ-ММ-ДД ЧЧ:ММ:СС+1, что приводит к хранению переменной сеанса ГГГГ-ММ. -ДД ЧЧ:ММ:СС+1 для обоих сеансов. Что неправильно.
 – 
check123
11 Апр 2011 в 18:54
Транзакции будут работать так, как предложено в комментариях к вашему вопросу. В качестве альтернативы вы можете выполнить SELECT после получения LAST_INSERT_ID(), чтобы включить более высокий параллелизм.
 – 
nikhil500
11 Апр 2011 в 20:52