7
votes

Forcer à la première mise à jour, puis sélectionnez dans une procédure

J'ai cette procédure dans MySQL (ne vous inquiétez pas de comprendre ce qu'elle fait, regardez simplement la partie où le curseur est ouvert) xxx

et dans cette partie xxx

La procédure sélectionne les données, puis mettez-la à la mettre à jour (crois-moi, je suis mort sérieux), et j'ai vraiment besoin de sélectionner après, car je génère un xml < / code> avec les données modifiées, donc:

1 Pourquoi la sélection de la mise à jour, car je vois que SELECT est sous la mise à jour

2 Qui avait cette "bonne idée" à faire C'est de cette façon?

Merci.


6 commentaires

Pas assez d'informations pour reproduire le problème. De plus, quand vous parlez de «qui avait cette idée brillante», de quoi parlez-vous? Suis-je censé connaître l'auteur de la procédure stockée?


Bon point, non, mais croyez-moi, il est très câblé que cela puisse la sélectionner, puis la mise à jour, car j'essaie d'extraire les données avec PHP ( codépad.org/uvg6ht8p )


"Ne vous inquiétez pas de comprendre ce que cela fait, regardez simplement la partie où le curseur est ouvert" -> Vous pouvez écrire une procédure de test très simple, sans la logique de votre algorithme, nous pouvons donc nous concentrer sur le problème que vous avez soulignent.


Vous avez raison, mais j'ai enseigné qu'il y a quelque chose qui ne va pas dans mon code qui le fait, comprend?


OK, mais c'est la bonne situation pour essayer une procédure de test afin que vous puissiez voir si la cause du problème est votre code ou votre comportement MySQL.


J'ai des recherches et que mes résultats sont mes résultats, CODEPAD.ORG/BC6YN2Z3 , apparemment, je vois qu'une procédure simple fait d'abord Mettre à jour puis sélectionnez, en fonction de l'ordre des requêtes ...


3 Réponses :


1
votes

Lorsque vous avez dans une mise à jour par lots / Supprimer et quelque chose d'autre dans SQL-Server, il est complètement indéterminaliste dans lequel ordre "Commandes" sera exécuté. La solution à ce problème est de mettre "Mise à jour" dans un lot différent, en utilisant la déclaration "EXEC". Alors essayez d'utiliser:

exec('UPDATE user_info SET notifications = notifications + 1 WHERE user_info.user_id =' + var_user_id); 


2 commentaires

Est-ce disponible dans MySQL? et j'ai des recherches et que mes résultats sont mes résultats, codépad.org/bc6yn2z3 , apparemment je vois qu'une procédure simple fait Première mise à jour puis sélectionnez, en fonction de l'ordre des requêtes ...


Désolé, dans mon esprit, j'ai sauté que c'est MySQL. Dans ce cas, mon conseil est de faire une procédure stockée avec la mise à jour, puis utilisez-la dans la boucle. Peut-être que ça va marcher.



1
votes

J'ai résolu le problème: L'instruction SELECT doit être en dehors de la boucle curseur .


0 commentaires

0
votes

Je voudrais que la mise à jour et la sélection sont exécutées dans le bon ordre, mais le Select n'a pas pu "voir" le résultat de la mise à jour en raison de l'isolement de la transaction.

Je suggérerais la solution suivante à contourner ce problème et Améliorez les performances en éliminant la jointure dans la sélection suivante: xxx


0 commentaires