我在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
返回两个不同的人/线程的相同id时,因为用户注册都不能在同一事务中。
还有其他更好的选择next id for a shard using range
的方法吗?
答案 0 :(得分:0)
select max(id) from t for update
应该锁定最大ID,直到交易完成。