Принципы параллельной работы с данными в Node.js: транзакции и блокировки в MySQL, PostgreSQL и MongoDB в 2026 году

Принципы параллельной работы с данными в 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 и потерянные обновления. Для борьбы с этим базы используют разные стратегии:

MySQL - классика с InnoDB

MySQL (InnoDB) остаётся популярным выбором для приложений средней сложности. Поддерживает ACID-транзакции и несколько уровней изоляции.

Самые используемые уровни в 2026 году:

Пример транзакции с 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 без блокировки чтения.

Популярные уровни изоляции:

С 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:

Пример с нативным драйвером 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 года

Краткая таблица для выбора:

Топ-инструменты 2026: Prisma (лидер по DX), Drizzle (производительность + SQL-подобный синтаксис), TypeORM (гибкость), нативные драйверы + retry-библиотеки (например mongodb-transaction-retry).

Главный совет: держите транзакции максимально короткими, используйте правильный уровень изоляции и мониторьте deadlocks / lock wait time.

Fullstack-разработчик в Москве
Александр
Fullstack-разработчик в Москве

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