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