Comparez les prix des domaines et des services informatiques des vendeurs du monde entier

Node.js + MySQL - Transaction en cours

Je crée une application sur node.js par express Et pilotes node-mysql. Dans ma demande, il y a quelques cas où j'ai besoin de faire une série database inserts/updates., Je veux qu'ils soient dans une transaction de manière à ce que la deuxième ou la troisième erreur échoue, les inserts précédents seront complètement roulées.

Actuellement, je le fais de manière à avoir un logiciel intermédiaire qui fait
START TRANSACTION

, Quand la demande est reçue. Lors du traitement de la demande, si une erreur se produit, j'attrape cette erreur et faites
ROLLBACK

. Si les erreurs ne se produisent pas, je fais
COMMIT

Avant d'envoyer une réponse au navigateur.

Cependant, maintenant, je crains que cela ne fonctionne pas lorsque plusieurs utilisateurs ont accès à la demande en même temps, car MySQL Fixation forcée/S'engager/, Si une autre demande essaie de démarrer sa propre transaction avec
START TRANSACTION

! Actuellement, j'utilise une seule instance du nœud et une connexion MySQL Pour toutes les demandes.

Quelqu'un peut-il me conseiller si mes craintes sont raisonnables et comment devrais-je obtenir le soutien des transactions?
Invité:

Daniel

Confirmation de:

Vérifier
https://github.com/bminer/node-mysql-queues
J'ai mis en œuvre une petite coquille pour node-mysql Pour soutenir les transactions et plusieurs opérateurs. Il n'a pas été testé et prêt pour la production NOT... Mais cela se passera dans quelques jours. :/

UPDATE

: J'ai déjà testé soigneusement cette bibliothèque ... ça doit être bon d'aller!

Alice

Confirmation de:

Selon la difficulté de votre transaction, vous pouvez rencontrer laid de nidification laid, en essayant de mettre vos demandes du noeud, ce qui peut entraîner des problèmes laids avec la zone de visibilité des variables.

Au lieu de cela, vous pouvez écrire une procédure stockée et le compléter
SELECT

ing Drapeau de réussite/échecs, puis demander une procédure en utilisant
https://github.com/felixge/node-mysql
, Comment feriez-vous une demande
SELECT

. C'est ainsi que la procédure stockée peut regarder:


DELIMITER //
DROP PROCEDURE IF EXISTS MyProcedure //
CREATE PROCEDURE MyProcedure/IN param1 VARCHAR/*, My, Parameters, ... *//
BEGIN

DECLARE EXIT HANDLER FOR NOT FOUND, SQLWARNING, SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 0 AS res;
END;

START TRANSACTION;
# My Transaction ...


COMMIT;
SELECT 1 AS res;

END //
DELIMITER ;


Votre code de nœud va ressembler à ceci:


var mysql = require/'mysql'/;

var client = mysql.createClient/{
host : '127.0.0.1',
user : 'username',
password: 'password'
}/;
client.query/'USE mydatabase'/;

var myParams = "'param1', 'param2', ... ";
client.query/"CALL MyProcedure/" + myParams + "/", function/err, results, fields/ {
if /err || results[0].res === 0/ {
throw new Error/"My Error ... "/;
} else {
// My Callback Stuff ...

}
}/;

Emile

Confirmation de:

Vous devrez créer un pool client ou une autre solution pour vous assurer que deux pages différentes n'intermèrent pas les commandes en une seule connexion. /au moins aussi longtemps que l'un d'entre eux est en transaction/.

Étant donné que vous souhaitez rouler conditionnellement en fonction du résultat d'une commande antérieure, vous devrez relier les appels de la base de données ensemble via leurs rappels et ne comptez pas sur le comportement de la file d'attente. node-mysql. Cela ouvrira la fenêtre pour une autre page pour entrer et faire la queue de l'opération sur la même connexion que vous le suggérez.

Vous pouvez créer et gérer votre propre file d'attente, mais cela conduira à la sérialisation de toutes les pages de transaction. /À condition que vous déteniez le modèle d'une seule connexion/.

Si vous google rapidement, alors il s'avère que github Il y a plusieurs piscines node-mysql. Cependant, les regarder, ils ne ressemblent pas comme s'ils vous aident à résoudre votre problème.

Emmanuel

Confirmation de:

Il est difficile pour moi de croire que si une session séparée effectue
START TRANSACTION

, Ensuite, d'autres transactions sont effectuées. Ce serait totalement dangereux, surtout lorsque les données doivent être renvoyées /ou ça "Varier"?/.

Est-il possible de le confondre avec le même

à la même session

START TRANSACTION

?

Cm.
http://dev.mysql.com/doc/refma ... .html
Où il est expliqué que les transactions ne peuvent pas être intégrées. il , Bien sûr, fait référence à

Session

, Et pas à une session d'un autre utilisateur.

En supposant que vous ne vous aviez pas préoccupé par le niveau d'isolement de votre session ou du niveau mondial d'isolement, la transaction doit être sûre.

Dans tous les cas, si vous vouliez mettre nos transactions dans la file d'attente, il serait facile de construire un objet de file d'attente global dans le nœud et les défis de la chaîne de liaison. /donc on commence quand l'autre se termine/. Simple Array S. push et pop Doit faire votre entreprise.

Cyprien

Confirmation de:

Juste une idée: sur postresql Vous pouvez exécuter une transaction et installer pour cela. ID. Ainsi, vous pouvez réutiliser la même connexion, car si vous avez besoin de réparer/S'engager/ Ou vous refuserez de vous référer à votre transaction d'identifiant, non?

Pour répondre aux questions, connectez-vous ou registre