Присвоение ключей от строк одной таблицы строкам другим проблемам параллелизма - PullRequest
0 голосов
/ 14 января 2012

В таблице пользователей, которую я добавляю, новые строки, каждая из которых должна содержать ссылку на идентификатор уникальной строки в другой таблице «ключей доступа».

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

Итак, у меня есть скрипт php, который создает новую строку пользователя, и у меня есть таблица ключей доступа, заполненная множеством строк.Как создать ссылку на идентификатор уникальной строки в таблице «ключей доступа» и как узнать, что она уникальна?

Ответы [ 2 ]

2 голосов
/ 14 января 2012

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

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

Невозможно получить конкретный ответ на вопрос «какие ключи доступа в настоящее время не используются», пока идет какая-либо транзакция, которая может находиться в самом процессе измененияответ на этот вопрос.

Вместо того, чтобы извлекать готовые ключи доступа из пула, вы можете сгенерировать ключи доступа, хэшируя ID пользователя или имена пользователей или что-то в этом роде?Если это так, я бы сделал это.

Если нет, вам придется либо принять полную сериализацию (т.е. задержку транзакции и, возможно, время ожидания транзакции), либо вам придется принять фактчто все может пойти не так.

Обратите внимание, что «принятие полной сериализации» не должно быть проблематичным.Если вы сохраняете свои транзакции недолговечными (т. Е. Делаете их быстро), скорее всего, вы даже не заметите сериализацию.

1 голос
/ 14 января 2012

Вы делаете это последовательно из всех потоков, выполняющих вставку:

1) добавить строку в таблицу пользователей
2) получить идентификатор этой новой строки
3) вставить в таблицу ключей доступа, используя идентификатор, полученный в # 2
4) перейти к 1) до завершения

MySQL может безопасно возвращать последний идентификатор, который он создал как часть запроса на вставку для каждого соединения - вставка, сделанная каким-либо другим потоком, не будет перезаписывать «последний идентификатор вставки» другого потока - последний идентификатор вставки, сохраненный для каждого соединения основа.

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

...