J'essaie d'utiliser le verrouillage de la rangée MySQL pour émuler essentiellement un MontEx sur une rangée. Disons que ma table a 2 colonnes, un identifiant et un champ de texte et trois entrées (1, A) (2, B) et (3, C).
Sélectionnez * à partir de la table; retournerait ces résultats.
Je peux verrouiller une ligne spécifique la voie normale. Toutefois, si d'une seconde connexion, je devais sélectionner * à partir de la table. Il retournerait tous les 3 résultats. Existe-t-il un moyen de verrouillage de niveau de ligne pour empêcher fondamentalement n'importe quel choix de voir / à l'aide d'une ligne verrouillée? Fondamentalement, j'essaie d'empêcher toute personne d'utiliser la ligne qui est actuellement utilisée / manipulée, ou même la visualisation de la ligne comme ses données (car elle est utilisée / manipulée) ne peut pas être confiée pour être précise au moment d'une sélection . p> p>
4 Réponses :
Je ne sais pas s'il y a un mécanisme spécifique de verrouillage natif, mais mon premier instant serait de donner à la table une colonne d'état (par exemple, Sur une note latérale, je ne sais pas ce que vous faites, mais n'est-ce pas une tâche qui devrait être effectuée de niveau ou deux au-dessus du moteur de base de données? p> verrouillé code>) et de la définition que sur < Code> 1 code> lors du verrouillage de la ligne. Un
SELECT CODE> sensible de cela permettrait toujours d'ajouter un
où verrouillé! = '1' code> condition à n'importe quelle requête. P>
J'étais juste curieux de savoir si c'était possible ou non de la base de données. Comme ma méthode actuelle se sentait un peu maladroite. Le projet est multithreadé et chaque thread doit sélectionner des travaux à partir d'une base de données (le travail est ajouté de plusieurs zones constamment), cependant, pas de deux threads ne devraient tenter le même travail en même temps, alors ma solution actuelle était donc un MontEx sur Une fonction qui a sélectionné le travail disponible, puis a mis à jour ces lignes spécifiquement pour dire qu'elles sont travaillées avant de libérer le mutex. Je suppose que je fais déjà la meilleure solution.
Si vous définissez le niveau d'isolation de transaction sur Ce mode est en conflit avec les verrous placés par note, cependant, que disent, vous avez un index sur utilise cet index. p> ceci verrouille tous les enregistrements em> avec Serializable code>,
innodb code> WIL Implication APPEND
verrouillage en mode partage code> à tous
Sélectionnez Code> Décloses.
Sélectionnez pour mettre à jour code> et le
SELECT code> S Verrouiller. p>
innodb code> peut verrouiller plus de lignes que de satisfaire le
où code> condition. C'est parce qu'il verrouille toutes les lignes scannées em>, non seulement celles assorties em>. P>
col1 code> et cette requête: p>
col1 = 1 < / code>, même ceux avec
col2 <> 2 code> p> p>
En réalité, les données de la ligne peuvent être approuvées, même si vous le manipulez. P>
Si vous démarrez une transaction à partir d'une connexion, d'autres connexions ne verront aucun de vos modifications tant que vous ne commetez pas la transaction. P>
Vous avez besoin d'un E.g. P>
client A fait Client B fait client A écrit / insère / met à jour quelque chose que quelque chose est alors un client B désormais désagréable et reprend le traitement P> verrouillage en mode partage code>. Utilisant avec Sélectionner des garanties, personne d'autre ne verrouille de lignes avec
pour la mise à jour code>. P>
Sélectionnez * à partir de la table où Type = 2 pour la mise à jour CODE> P>
SELECT * à partir du verrouillage de table en mode partage code> et bloque ici p>
commettre code> p>
Peut-être pas ce que vous (ou i) veulent entendre, mais il semble que si le deuxième sélecteur utilise également
SELECT ... pour la mise à jour code>, il va attendre que le verrouillage initial soit libéré.