До недавнего времени все было нормально. Сейчас перевел один модуль на транзакции, вот код:
Сам модульsocket.on('sell', async (id) => {
try {
id = parseInt(id, 10);
if(!socket || !socket.userid) {
return;
}
if(!id) {
return;
}
let transaction = await connection.prepareTransaction();
try {
await transaction.beginTransaction();
let item = await transaction.query('SELECT * FROM Items WHERE id = ? FOR UPDATE', [id]);
if(!item || !item[0]) {
await transaction.rollback();
transaction.release();
return;
}
if(!item[0].userid) {
await transaction.rollback();
transaction.release();
return;
}
await transaction.query('UPDATE Items SET ? WHERE id = ?', [{status: 0, userid: null, timestamp: 0}, id]);
await transaction.commit();
transaction.release();
} catch (e) {
await transaction.rollback();
transaction.release();
}
} catch (error) {
throw error;
}
});
mysql обработчикconst mysql = require('mysql');
const { promisify } = require('util');
const pool = mysql.createPool({
host: config.host,
user: config.user,
password: config.password,
database: config.database,
socketPath: '/var/run/mysqld/mysqld.sock',
connectionLimit: 100
});
exports.prepareTransaction = () => {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) throw err;
const query = promisify(connection.query).bind(connection);
const commit = promisify(connection.commit).bind(connection);
const rollback = promisify(connection.rollback).bind(connection);
const beginTransaction = promisify(connection.beginTransaction).bind(connection);
const release = connection.release;
resolve({beginTransaction, query, commit, rollback, release});
});
});
};
Через определенное время (зависит от активности пользователей) mysql отваливается, при чем никакая ошибка не прилетает. Единственная версия - забиваются все доступные коннекты, т.к. не делается connection.release(), но в моем случае он вроде бы везде есть. Тем самым при подключении клиент ждет доступную сессию, а ее никогда уже и не будет.
После перезагрузки все снова работает нормально и через час-несколько часов mysql снова падает. До обновления такого не было.
На момент, когда умирают запросы в приложении (по всей видимости которые находятся в постоянном ожидании), PROCSSLIST показывает:
И таких процессов чуть больше 100 штук.
После рестарта приложения их всего навсего становится:
И после этого приложение работает адекватно 2-5 часов.
В htop вижу такие процессы:
Но они не имеют никакого отношения к работе базы, как я понял.