Comment verrouiller une seule ligne
J'ai un user
table avec un champ lastusedecnumber
.
J'ai besoin de l'accès et de l'incrément lastusedecnumber
.
Pendant que l'accès en temps j'ai besoin de verrouiller utilisateur particulier de la ligne (pas l'ensemble de la table).
Comment puis-je faire cela?
Le type de table est MyISAM
.
- Seulement InnoDB a verrouillage de ligne; MyISAM, de la MÉMOIRE et de FUSION sont de niveau table
- Assurez-vous de vérifier d'autres Stackoverflow questions concernant les verrous de niveau ligne pour être sûr que vous êtes de faire un choix instruit.
Vous devez vous connecter pour publier un commentaire.
MySQL utilise uniquement au niveau de la table de verrouillage de tables MyISAM. Si vous le pouvez, passez en InnoDB pour le verrouillage de ligne.
Voici un lien vers le site de MySQL décrire des Verrous fixées par les Instructions SQL pour les tables InnoDB.
http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
Genre de retard, mais j'espère que ça aidera quelqu'un:
Vous donnera atomique incrément de lastusedecnumber et de la capacité à lire la nouvelle valeur de
lastusedecnumber
champ (après incrémentation) à l'aide deSELECT LAST_INSERT_ID()
.Comme une solution de contournement, vous pouvez ajouter une colonne à votre table, comme
locked TINYINT(1)
- chaque fois que vous voulez la ligne à être verrouillé vous le réglez à1
. Lorsque vous essayez d'accéder à cette ligne, la première chose à faire est de vérifier si lelocked
champs est défini.Pour déverrouiller la ligne, il suffit de le mettre à
0
de nouveau. Pas joli, mais vraiment une solution simple.LOCK=0
, puis ils ont tous deux entrer dans la section critique, les deux setLOCK=1
, et vous avez caché condition de course bug.Je n'ai pas envie de la conversion de l'ensemble de ma base de données myisam. Donc, j'essaie simplement de créer une nouvelle table nommée en fonction de l'id de l'enregistrement, j'ai envie de verrouillage. Si créer un tableau est un succès, à faire mon travail et de supprimer le tableau à la fin. Si créer un tableau pas de succès, d'arrêter.
Une meilleure solution consiste à créer une colonne containting un horodatage. Chaque fois que vous souhaitez verrouiller la ligne de mise à jour à l'heure actuelle. Pour déverrouiller mise à jour pour un temps au moins de x minutes dans le passé. Ensuite, afin de vérifier si sa verrouillé vérifier que l'horodatage est au moins de x minutes.
De cette façon, si le processus se bloque (ou l'utilisateur ne se termine jamais leur fonctionnement) de la serrure efficacement expire au bout de x minutes.