2009-05-22 3 views
1

J'ai un objet de domaine qui ressemble à ceci:Comment s'assurer que seule la ligne du tableau sera créée avec un état particulier?

class UserStuff 
{ 
    String userid; 
    boolean primordial; 
} 

Dans le tableau, primordial est un TINYINT. A L'utilisateur peut avoir éventuellement plusieurs UserStuff. Ce que je veux m'assurer, c'est qu'une seule ligne (la première ligne créée) aura un caractère primordial == 1. Toutes les lignes suivantes auront un caractère primordial == 0. En un coup d'œil, il n'y a pas de quoi s'inquiéter. Supposons que plusieurs demandes de création pour UserStuff peuvent se produire en même temps, comment puis-je garantir cette contrainte?

Mon idée initiale est de synchroniser sur une chaîne (dans le service de domaine)

class DomainService 
{ 
    public void create(UserStuff stuff) 
    { 
     synchronized(stuff.userid + "/userstuff/lock") 
     { 
      ... 

     } 
    } 
} 

J'aimerais entendre des commentaires au sujet de cette & méthodes alternatives. Merci

Répondre

1

L'approche SQL, d'une manière générale, est de faire (userid, primordial) une clé composé unique, et utiliser l'instruction INSERT avec une clause de ON DUPLICATE KEY UPDATE - qui définit primordial autrement (mais je dois admettre que je ne suis pas sûr de ce qui se passe si le UPDATE frappe également un doublon, comme il le ferait lorsque vous insérez le deuxième non-primordial UserStuff).

Alternativement, avec des transactions convenablement isolées, vous pouvez d'abord SELECT pour vérifier si ce userid est déjà présent, dans la même transaction INSERT avec des valeurs appropriées de primordial. L'approche SQL serait plus solide si vous aviez déjà des mises à jour de plusieurs processus (peut-être sur différents nœuds clients), mais si vous êtes sûr à 100% que cela n'arrivera jamais vos idées basées sur la sychronisation Java pourraient obtenir de meilleures performances ... Je ne vais pas deviner d'une manière ou d'une autre, mais je vous recommande de mesurer les choses dans les deux sens (si vous êtes prêt à parier votre chemise sur jamais, jamais obtenir des mises à jour de plusieurs nœuds clients, c'est ;-) .

`

+0

Je ne suis pas familier avec le Duplicate KEY UPDATE, donc je vais devoir lire à ce sujet. Il est possible d'obtenir plusieurs mises à jour de client, donc la concurrence est un problème que je vais devoir gérer. – ashitaka

Questions connexes