Лучший способ выбрать следующий лучший максимальный идентификатор для шарда
У меня есть случай использования для основанного на диапазоне шарда в 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
Должен удерживать блокировку максимального идентификатора до завершения транзакции.