Node.js + MySQL - gestion des transactions
Je suis la création d'une application sur node.js à l'aide de l'express, et le nœud-pilote mysql. Il ya un couple de cas dans mon application j'ai besoin de faire une série de base de données insertions/mises à jour. Je veux une opération telle que si la deuxième ou de la troisième échec, le précédent inserts sont annulées complètement.
Actuellement, je suis en train de faire c'est d'avoir une sorte de middleware qui ne un START TRANSACTION
lorsqu'une demande arrive. Au cours du traitement de la demande, si une erreur est levée, je rattrape cette erreur, et faire un ROLLBACK
. Si aucune erreur ne se produit, je fais un COMMIT
avant l'envoi de la réponse au navigateur.
Cependant, je suis préoccupé du fait que cela ne fonctionne pas lorsque plusieurs utilisateurs accèdent à l'application simultanément, que MySQL n'est forcé d'engager si une autre demande essaye de commencer sa propre transaction avec START TRANSACTION
! Je suis actuellement en utilisant une seule instance de nœud, et une seule connexion MySQL pour toutes les demandes.
Quelqu'un peut-il svp me conseiller si mes craintes sont légitimes, et comment pourrais-je obtenir dans les opérations de soutien?
source d'informationauteur jeffreyveon
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin pour créer un pool de client, ou en quelque sorte de s'assurer que les deux pages ne sont pas intercalant des commandes sur la même connexion (au moins pendant que l'un d'eux est dans une transaction).
Puisque vous voulez conditionnellement faire une restauration basée sur le résultat d'une commande précédente, vous aurez besoin pour la chaîne de la db des appels par le biais de leurs rappels et ne pas compter sur le nœud-mysql comportements des files d'attente. Qui va ouvrir une fenêtre pour une autre page à venir et de file d'attente pour monter une opération sur la même connexion que vous suggérez.
Vous pouvez créer et gérer votre propre file d'attente, mais qui finira par la sérialisation de toutes les pages transactionnelles (en supposant que vous êtes collant avec le seul modèle de connexion).
À partir d'une rapide recherche sur google, il semble que il ya plusieurs nœuds-mysql piscines sur github. Après regarder, cependant, ils ne regardent pas comme ils vous aider avec votre problème.
Découvrez https://github.com/bminer/node-mysql-queues
J'ai mis en place un petit wrapper pour le nœud-mysql pour soutenir les transactions et plusieurs états. Il n'a pas été testé, et n'est PAS prêt pour la production... mais ce sera dans quelques jours. 🙂
Mise à JOUR: j'ai testé cette bibliothèque très bien maintenant... devriez être bon d'aller!
Selon la complexité de votre transaction, vous pouvez exécuter dans certains laid de nidification en essayant de file d'attente de vos requêtes de Nœud, ce qui pourrait introduire laid variable de portée des questions.
Ce que vous pouvez faire est d'écrire une procédure stockée et à la fin il en
SELECT
ing de succès/échec drapeau, alors la requête de la procédure avec nœud-mysql comme vous le feriez pour unSELECT
requête. Voici comment la procédure stockée peut se présenter:Votre Nœud de code devrait ressembler à quelque chose comme ceci:
J'ai du mal à croire que si une session séparée exécute une
START TRANSACTION
que d'autres transactions sont validées. Ce serait totalement dangereux, en particulier lorsque des données doivent être rollbacked (ou est-il "annulées"?).Est-il possible que vous mixez le tout avec un même session
START TRANSACTION
?Voir http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html où il explique que les transactions ne peuvent pas être imbriqués. Que, bien sûr, s'applique à la même session, non pas à une autre session de l'utilisateur.
En supposant que vous n'avez pas foiré autour avec le niveau d'isolation de votre session, ou l'isolation globale du groupe, les transactions doivent être sûrs.
Dans tous les cas, si vous voulez la file d'attente de vos transactions, il ne serait pas difficile de construire un mondial de la file d'attente objet du nœud et de la chaîne d'appels (si l'on commence quand une autre se termine). Un tableau simple avec push et pop devrait faire l'affaire.
Juste une idée: sur postresql, vous pouvez démarrer une transaction et de définir un ID. Alors, vous pourriez être en réutilisant la même connexion autour de, parce que dans le cas où vous avez besoin de commit ou rollback, vous allez consulter votre transaction par id, droit?