#186

Долго ли умеючи

Транзакции с базой данных нужно открывать и закрывать как можно быстрее. Внутри транзакции категорически нельзя делать никакого ввода-вывода: ни записи/чтения файла, ни, упаси Боже, ответа веб-сервера.

db.query('BEGIN');
db.query('UPDATE Videos SET viewsCount = viewsCount+1 WHERE videoId=14');
const count = db.query('SELECT viewsCount FROM Videos WHERE videoId=14');
res.send({
  videoId,
  count
});
db.query('COMMIT');

Вот так делать нельзя! Пока думает сетевой код, табличка или запись или страница в базе остаются залочены. Такой код будет сильно тормозить сервис.

Все данные перед транзакцией нужно приготовить, а все результаты из транзакции собрать в память. И сразу выйти.

Скажешь, очевидно? Конечно. За январь я выловил три таких случая в коде, а год назад ровно на обнаружении этой проблемы мне удалось сократить затраты на базу с $600 до $138 в месяц.