2010-12-10 8 views
0

J'ai un cas assez simple dont je suis un peu confus. Je veux insérer un enregistrement, qui doit être unique. Ainsi, s'il existe, je dois le remplacer ou le supprimer et le réinsérer. Si ce n'est pas le cas, je dois le créer - mais je dois m'inquiéter que quelqu'un d'autre fasse le test et crée le même en même temps.Verrouillage sur l'insert

Quelqu'un peut-il recommander la façon "correcte" de faire cela en ce qui concerne le verrouillage de MySQL? c'est-à-dire empêcher quelqu'un de faire conjointement la même chose?

Si je le fais - je ne suis pas protégé contre les insertions concurrentes de dossiers avec la même condition:

BEGIN TRANSACTION 
SELECT (condtions) FOR UPDATE 
if rows exist 
    UPDATE 
else 
    INSERT 
COMMIT 

On dirait une chose simple - évidemment très rouillé à SQL ...

également :

Si je suis titulaire d'un verrou, et qu'un autre utilisateur essaie de lire/écrire quelque chose qui est retenu par le verrou - l'autre utilisateur recevra-t-il une erreur, ou son traitement sera-t-il retardé? sed?

Répondre

1

Je crois que vous cherchez REPLACE (si elles existent, supprimer et re-insert) - http://dev.mysql.com/doc/refman/5.1/en/replace.html

OU

insert ... on duplicate key update ... /* does not remove, just update */ 
+0

Super! Une autre question connexe: Les données dans ma base de données sont une carte - ainsi chaque enregistrement "unique" (s'il existe) a une coordonnée X et Y. Puis-je créer une table qui utilise des champs * deux * qui, ensemble, doivent être uniques - ou dois-je fusionner les nombres en une seule valeur et en faire la clé unique? – Brad

+0

bien sûr, ceci est connu comme la clé naturelle - http://en.wikipedia.org/wiki/Natural_key comme opposé de la clé de substitution - http://en.wikipedia.org/wiki/Surrogate_key. Avantages et inconvénients peuvent être trouvés sur SO et aussi discuter sur le wiki – ajreal