web-dev-qa-db-fra.com

Comment verrouiller une seule ligne

J'ai une table user avec le champ lastusedecnumber.

Je dois accéder et incrémenter lastusedecnumber.

Pendant ce temps d'accès, je dois verrouiller cette ligne d'utilisateur particulière (pas la table entière).

Comment puis-je faire cela?

Le type de table est MyISAM.

22
svk

MySQL utilise uniquement le verrouillage au niveau de la table à partir des tables MyISAM. Si vous le pouvez, passez à InnoDB pour le verrouillage au niveau des lignes.

Voici un lien vers le site MySQL décrivant les verrous définis par les instructions SQL pour les tables InnoDB. http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html

24
belwood

Un peu tard, mais j'espère que cela aidera quelqu'un:

UPDATE user SET lastusedecnumber = LAST_INSERT_ID(lastusedecnumber + 1);
SELECT LAST_INSERT_ID();

Vous donnera un incrément atomique de lastusedecnumber et la capacité de lire la nouvelle valeur du champ lastusedecnumber (après incrément) en utilisant SELECT LAST_INSERT_ID().

4

Pour contourner ce problème, vous pouvez ajouter une colonne à votre table, comme locked TINYINT(1) - chaque fois que vous souhaitez verrouiller la ligne, vous la définissez sur 1. Lorsque vous essayez maintenant d'accéder à cette ligne, la première chose à faire est de vérifier si les champs locked sont définis.

Pour déverrouiller la ligne, définissez-la simplement sur 0 encore. Pas sympa mais une solution de contournement vraiment simple.

1
dhh

Je n'avais pas envie de convertir toute ma base de données depuis myisam. J'essaie donc simplement de créer une nouvelle table nommée en fonction de l'ID de l'enregistrement que je veux verrouiller. Si la création de la table réussit, faites mon travail et supprimez la table à la fin. Si la création de la table échoue, arrêtez.

0
oyvey