2017-01-16 1 views
0

J'ai un cas d'utilisation pour tesson à base de gamme dans une base MySQL i.e.meilleure façon de choisir le meilleur suivant id max pour un tesson

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

Signification Shard1 a 1- 500 utilisateurs et shard2 a 501-1000 utilisateurs et ainsi de suite. Alors que ce dernier point sur la base d'utilisateurs se développer, continuera à ajouter de nouveaux fragments.

Le tableau utilisateur ressemble ci-dessous:

----------------------------- 
id | name | email | contact 
----------------------------- 
1 |Test |[email protected]|xxxxx 
501 |Test1 |[email protected]|xxxxx 
101 |Test2 |[email protected]|xxxxx 
1001 |Test3 |[email protected]|xxxxx 

Ainsi, l'utilisateur avec le nom Test réside dans shard1, l'utilisateur avec le nom test2 réside dans shard2 et l'utilisateur avec le nom Test3 réside dans shard3 et ainsi de suite.

Lorsqu'un nouvel enregistrement utilisateur se produit, sur la base open shards permet de dire (Shard4 et Shard5 est ouvert pour l'enregistrement), il fait d'abord un select on the user table with range pour obtenir le next max possible Id et l'incrément de 1 et stocke. Le problème avec cette approche est quand deux personnes différentes essayent de s'inscrire et du code select renvoie le même id pour les deux différentes personnes/fil car l'enregistrement d'utilisateur ne peut pas être dans la même transaction. Y at-il un autre meilleur moyen de choisir le next id for a shard using range?

+0

En option, vous pouvez utiliser SP (procédure stockée) pour cela sans sélectionner et insérer. Sp va le faire et retourner l'identifiant. –

+0

@MaheshMadushanka: Comment SP va-t-il savoir de quel shard il ira, je veux dire quelle gamme pour s'occuper, aussi comment il va gérer le tesson plein? Je suis pauvre en mysql, toute référence d'échantillon aide vraiment –

+0

La probabilité de votre problème est considérablement réduite, si vous pouvez vous assurer qu'il n'y a virtuellement * pas de temps * entre tirer l'identifiant max et stocker le nouveau incrémenté. Vous pouvez vous en assurer en utilisant un SP ou en envoyant les statemets 'select' et' insert' * directement * les uns après les autres. – cars10m

Répondre

0
select max(id) from t for update 

Devrait conserver le verrou sur l'ID max jusqu'à la fin de la transaction.