Ho a che fare con un promblem per un paio di giorni, e spero davvero che tu possa aiutarmi.Gestione transazioni rollback MySQL in Node.js
È un'API basata su node.js
che utilizza sequelize
per MySQL
.
Su alcune chiamate API il codice inizia SQL
transazioni che bloccano determinate tabelle e se invio più richieste contemporaneamente all'API, ho ricevuto errori LOCK_WAIT_TIMEOUT
.
var SQLProcess = function() {
var self = this;
var _arguments = arguments;
return sequelize.transaction(function (transaction) {
return doSomething({transaction: transactioin});
})
.catch(function (error) {
if (error && error.original && error.original.code === 'ER_LOCK_WAIT_TIMEOUT') {
return Promise.delay(Math.random() * 1000)
.then(function() {
return SQLProcess.apply(self, _arguments);
});
} else {
throw error;
}
});
};
Il mio problema è, le richieste in esecuzione contemporaneamente si bloccano a vicenda per un lungo periodo di tempo, e la mia richiesta ritorna dopo un lungo lungo tempo (~ 60 secondi).
Spero di poterlo spiegare in modo chiaro e comprensibile e potresti offrirmi qualche soluzione.
Questo non è un problema 'node.js' o' sequelize', è un messaggio di errore di MySQL '1205 Lock wait timeout exceeded; prova a riavviare la transazione ». Dovresti esaminare le transazioni e i loro stati all'interno del server MySQL. –
È assolutamente chiaro, perché ottengo questo errore. Sto cercando una soluzione su come potrei gestirla. – Adam
C'è solo un modo per capire cosa succede ed è 'SHOW ENGINE INNODB STATUS \ G'. Nella mia esperienza, ho avuto transazioni con blocchi fissi in MySQL più volte. –