Лучший способ выбрать следующий лучший максимальный идентификатор для шарда

У меня есть случай использования для основанного на диапазоне шарда в MySQL, т.е.

---------------------
shard   | upperbound
---------------------
1       | 500
2       | 1000
3       | 1500

Имея в виду Shard1 имеет 1- 500 пользователи и shard2 имеет 501-1000 пользователи и тд. Так что последняя точка на пользовательской базе будет расти, будет продолжать добавлять новые шарды.

Таблица пользователей выглядит следующим образом:

-----------------------------
id   | name | email | contact
-----------------------------
1    |Test  |t@t.com|xxxxx
501  |Test1 |t@t.com|xxxxx
101  |Test2 |t@t.com|xxxxx
1001 |Test3 |t@t.com|xxxxx

Так что пользователь с именем Test проживает в shard1пользователь с именем test2 проживает в shard2 и пользователь с именем Test3 проживает в shard3 и так далее.

Когда происходит регистрация нового пользователя, на основе open shards скажем (Shard4 и Shard5 открыт для регистрации), то сначала он делает select on the user table with range чтобы получить next max possible Id и увеличить на 1 и сохранить его. Проблема с этим подходом заключается в том, когда два разных человека пытаются зарегистрироваться и из кода select возвращает один и тот же идентификатор для двух разных людей / потоков, поскольку обе регистрации пользователей не могут быть в одной транзакции.

Есть ли другой лучший способ выбора next id for a shard using range?

1 ответ

select max(id) from t for update

Должен удерживать блокировку максимального идентификатора до завершения транзакции.

Другие вопросы по тегам