
Принципы параллельной работы с данными в Node.js: транзакции и блокировки в MySQL, PostgreSQL и MongoDB в 2026 году
среда, 21 января 2026 г.
В 2026 году большинство современных приложений на Node.js работают с высокой конкуренцией запросов. Чтобы данные оставались консистентными при одновременном чтении и записи несколькими пользователями, разработчики используют транзакции и механизмы блокировок / concurrency control. В этой статье разберём, как это устроено в самых популярных базах - MySQL, PostgreSQL и MongoDB - и какие подходы сейчас в тренде.
Что такое транзакция и зачем нужны блокировки?
Транзакция - это атомарная последовательность операций: либо все выполняются успешно, либо ничего не меняется (ACID: Atomicity, Consistency, Isolation, Durability).
Проблема возникает при параллельном доступе: без правильной изоляции возможны dirty read, non-repeatable read, phantom read и потерянные обновления. Для борьбы с этим базы используют разные стратегии:
- Пессимистическое блокирование (locks)
- Оптимистическое блокирование (version / timestamp)
- MVCC - Multi-Version Concurrency Control
- Retry-механизмы при конфликтах
MySQL - классика с InnoDB
MySQL (InnoDB) остаётся популярным выбором для приложений средней сложности. Поддерживает ACID-транзакции и несколько уровней изоляции.
Самые используемые уровни в 2026 году:
- REPEATABLE READ (по умолчанию) - MVCC + gap locks / next-key locks против phantom reads
- READ COMMITTED - меньше блокировок, но возможны non-repeatable reads
Пример транзакции с mysql2 / promise в Node.js:
async function transferMoney(fromId, toId, amount) {
const conn = await pool.getConnection();
try {
await conn.beginTransaction();
const operations = [
['UPDATE accounts SET balance = balance - ? WHERE id = ?', [amount, fromId]],
['UPDATE accounts SET balance = balance + ? WHERE id = ?', [amount, toId]],
];
await Promise.all(operations.map(([sql, params]) => conn.execute(sql, params)));
await conn.commit();
} catch (err) {
await conn.rollback();
throw err;
} finally {
conn.release();
}
}
Проблема: длинные транзакции → table / row locks → замедление под нагрузкой.
PostgreSQL - король сложных транзакций и concurrency
PostgreSQL в 2026 году - №1 выбор для приложений, где важна строгая консистентность и сложные запросы. Использует мощный MVCC без блокировки чтения.
Популярные уровни изоляции:
- READ COMMITTED (по умолчанию)
- REPEATABLE READ
- SERIALIZABLE - почти полная имитация последовательного выполнения (очень надёжно, но дорого)
С Prisma (самый популярный инструмент 2025–2026) транзакции выглядят очень удобно:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function transfer(prisma: PrismaClient, fromId: number, toId: number, amount: number) {
return prisma.$transaction(async (tx) => {
await tx.account.update({
where: { id: fromId },
data: { balance: { decrement: amount } }
});
await tx.account.update({
where: { id: toId },
data: { balance: { increment: amount } }
});
// дополнительные проверки и действия
}, { isolationLevel: 'Serializable' }); // можно указать уровень
}
MongoDB - multi-document transactions с 4.0+
MongoDB с версии 4.0 поддерживает полноценные ACID-транзакции для нескольких документов (в replica set / sharded cluster).
Особенности concurrency в MongoDB:
- Пессимистическое блокирование на уровне документа при записи
- При конфликте → автоматический abort транзакции → нужно retry
- Чтение внутри транзакции snapshot-изоляция
- Не блокирует чтение другими транзакциями (optimistic-like поведение)
Пример с нативным драйвером MongoDB в Node.js:
async function transferMoney(client, fromAccount, toAccount, amount) {
const session = client.startSession();
try {
await session.withTransaction(async () => {
const db = client.db('bank');
const accounts = db.collection('accounts');
await accounts.updateOne(
{ _id: fromAccount },
{ $inc: { balance: -amount } },
{ session }
);
await accounts.updateOne(
{ _id: toAccount },
{ $inc: { balance: amount } },
{ session }
);
// здесь можно добавить любую другую бизнес-логику в рамках транзакции
// await accounts.updateOne(..., { session });
});
// commit происходит автоматически при успешном завершении withTransaction
} catch (error) {
throw error; // abort уже вызван внутри withTransaction
} finally {
await session.endSession();
}
}
Сравнение и тренды 2026 года
Краткая таблица для выбора:
- PostgreSQL + Prisma / Drizzle → сложная бизнес-логика, высокая конкуренция, аналитика
- MySQL + Sequelize / TypeORM → быстрый запуск, классические CRUD-приложения
- MongoDB → высокая масштабируемость по записи, гибкая схема, но транзакции дороже
Топ-инструменты 2026: Prisma (лидер по DX), Drizzle (производительность + SQL-подобный синтаксис), TypeORM (гибкость), нативные драйверы + retry-библиотеки (например mongodb-transaction-retry).
Главный совет: держите транзакции максимально короткими, используйте правильный уровень изоляции и мониторьте deadlocks / lock wait time.

Александр
Fullstack-разработчик в МосквеПрофессиональная разработка веб-приложений на Node.js с использованием современных frontend и backend фреймворков. Создание, продвижение, поддержка и обслуживание сайтов. Эффективно, прибыльно.