@vetsmen

Почему через некоторое время не работают все mysql-сесии?

До недавнего времени все было нормально. Сейчас перевел один модуль на транзакции, вот код:

Сам модуль
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 снова падает. До обновления такого не было.
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
megafax
@megafax
web-программист
Промониторьте SHOW PROCESSLIST и htop в течение часа, таким образом Вы точно выясните верно ли Ваше предположение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
BP Mobile Москва
До 250 000 руб.
1Win Санкт-Петербург
от 80 000 до 200 000 руб.
MobileUp Санкт-Петербург
от 100 000 руб.
15 авг. 2018, в 11:49
700 руб./в час
15 авг. 2018, в 11:44
2000 руб./за проект
15 авг. 2018, в 11:01
700 руб./в час