Devrais-je verrouiller une table ISAM pour insérer une valeur dans un champ clé unique?

StackOverflow https://stackoverflow.com/questions/169459

  •  05-07-2019
  •  | 
  •  

Question

J'ai une table ISAm dans mySql qui a été créée, semblable à ceci:

create table mytable (
 id int not null auto_increment primary key,
 name varchar(64) not null );

create unique index nameIndex on mytable (name);

J'ai plusieurs processus qui insèrent des lignes dans cette table. Si deux processus tentent d'insérer le même "nom", je veux m'assurer que l'un d'eux génère une erreur ou trouve la ligne avec le "nom" correspondant.

Dois-je verrouiller la table et vérifier si le verrou n’existe pas ou s’appuyer sur le serveur qui renvoie une erreur à l’un des processus qui essaient d’insérer une valeur qui existe déjà dans l’unique indexé champ?

Je suis un peu hésitant à utiliser un verrou car je ne veux pas me retrouver dans une impasse.

Était-ce utile?

La solution

Ne vous inquiétez pas du verrouillage, votre index empêchera les doublons. Vous devez gérer le code d'erreur de votre application.

MySQL devrait renvoyer un code d'erreur de 1062 (ou SQLSTATE 23000) lorsque votre contrainte de clé unique est violée.

Autres conseils

De la manière dont vous avez décrit la crainte de rencontrer un gouffre, le lien de causalité peut ne pas être clairement compris (à moins que votre interrogation ne se limite à celle décrite dans la question).

Un bon récapitulatif écrit par une autre personne :

  
      
  1. La requête 1 commence par verrouiller la ressource A
  2.   
  3. La requête 2 commence par verrouiller la ressource B
  4.   
  5. La requête 1, pour continuer, nécessite un verrou sur la ressource B, mais la requête 2 verrouille cette ressource. La requête 1 commence donc à attendre qu'elle soit libérée
  6.   
  7. Dans l'intervalle, la requête 2 tente de terminer, mais elle a besoin d'un verrou sur la ressource A pour pouvoir terminer, mais elle ne peut pas l'obtenir car la requête 1 a le verrou.
  8.   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top