为分片选择下一个最佳最大ID的更好方法

时间:2017-01-16 05:30:24

标签: mysql rds

我在mysql中有一个基于范围的分片的用例,即

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

含义Shard11- 500个用户,shard2501-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的方法吗?

1 个答案:

答案 0 :(得分:0)

select max(id) from t for update

应该锁定最大ID,直到交易完成。