Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql - Verrouiller les lignes pour la requête select ?

Le verrouillage natif de MySQL ne fournit pas cette fonctionnalité. Vous pourriez utiliser une colonne pour effectuer vos "locks".

En supposant que chaque thread ait un identifiant unique, vous pouvez créer une colonne nommée thread_owner , avec 0 par défaut.

Un fil saisirait une ligne comme celle-ci :

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Sélectionnez ensuite la ligne comme celle-ci (elle peut ne renvoyer aucune ligne s'il n'y avait pas de lignes à traiter) :

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Ensuite, traitez-le et enfin supprimez-le.

Cette solution fonctionnerait à la fois sur MyISAM et InnoDB.

Cependant, pour InnoDB, cela peut être lent car chaque instruction UPDATE essaie de verrouiller toutes les lignes où thread_owner =0, et à moins que vous ne soyez sûr de verrouiller toutes les lignes dans le même ordre à chaque fois, cela pourrait même provoquer un blocage. Ainsi, vous pouvez essayer de verrouiller explicitement toute la table dans votre instruction UPDATE :

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

De cette façon, MyISAM et InnoDB fonctionneront de la même manière.