Mysql Вставить последовательные строки на пользователя - PullRequest
0 голосов
/ 11 марта 2012

У меня есть таблица с названием «выборки», и когда пользователь входит в систему и начинает делать выборки, он первоначально вставляет 64 строки в таблицу «выборки» для этого пользователя (с идентификатором пользователя в качестве столбца).Строки вставляются с использованием цикла в php, поэтому имеется 64 вставки с использованием подготовленных операторов PDO.Это нужно сделать только один раз для каждого пользователя.Мне нужно, чтобы эти строки были последовательными для этого пользователя.Что если несколько других пользователей делают то же самое в одно и то же время?Есть ли вероятность, что строки не будут вставлены последовательно?Нужно ли использовать настольные замки?Я никогда не использовал их раньше.MySql версия: 5.0.92-rs-log MyISAM спасибо

Ответы [ 2 ]

0 голосов
/ 11 марта 2012

Прежде всего, должен быть лучший способ решить эту проблему, а не полагаться на то, что идентификаторы являются последовательными для одного пользователя.

Действительно, существует вероятность возникновения проблемы параллелизма.В других СУБД, таких как Oracle, вместо auto_increment есть последовательности, которые лучше подходят для такого рода вещей.Вы можете подражать этому, имея вспомогательную таблицу только с одной строкой.В этом случае для вашего поля идентификатора (или любого другого) НЕ будет установлено значение auto_increment, и у вас будет таблица с именем sequence (например), в которой вы сохраните последний идентификатор.Затем, перед вставкой 64 новых записей, вы запросите у этой таблицы последний идентификатор, а затем обновите его.

Примерно так (не обращайте внимания на функции PHP, простокод понятен):

// Get the last ID
$last_id = query('SELECT last_id FROM sequence LIMIT 1');

// Store the last ID in your code and then update the new value
$new_id = $last_id + 64;
query('UPDATE sequence SET last_id = :new_id', array('new_id' => $new_id));

// Make sure your DB class is set on auto_commit or commit the transaction here

// Insert your new records
for ($i = ++$last_id; $i < $new_id; $i++) {
    query('INSERT INTO picks (id, user_id) VALUES (:id, :user_id)', array('id' => $i, 'user_id' => $user_id));
}
0 голосов
/ 11 марта 2012

Я бы не использовал блокировки таблиц для задачи, которая на самом деле не требует их.Никакие строки не должны быть последовательными.Может быть, вы заказываете их на основе автоинкрементного идентификатора?Если это так, они могут не быть последовательными, но они будут в порядке.Кроме того, если вам нужен определенный порядок в этих строках, вы всегда можете добавить еще один столбец, в котором будет установлен реальный порядок.

В любом случае, попробуйте расширить свой вопрос, чтобы получить более подходящую помощь.

...