Как реализовать второй неуникальный идентификатор без проблем с параллелизмом? - PullRequest
0 голосов
/ 09 июля 2020

Учитывая эту MySQL таблицу references, где uid - это первичный и уникальный ключ:

uid |reference_id | foreign_id
1   | 1           | 123  
2   | 1           | 234
3   | 2           | 345
4   | 2           | 456
5   | 2           | 567

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

Есть ли у кого-нибудь какие-либо рекомендации по решению этой проблемы? Я думал о блокировке таблиц, но не уверен, возможно ли это, учитывая агности моего механизма БД c Doctrine / DBAL, который я использую.

1 Ответ

0 голосов
/ 09 июля 2020

Эта информация должна быть в другой таблице с ключом автоматического увеличения. Примерно так:

create table batches (
    batch_id int auto_increment primary key,
    dt datetime
    . . .   -- other information, such as the creation date
);

Тогда ваши вставки будут выглядеть так:

insert into batches (datetime)
    values (now());

set @id = last_insert_id();

insert to references (uid, batch_id, foreign_id)
    values (?, @id, ?), . . .;
...