← Назад к вопросам

Какие знаешь принципы транзакций?

1.7 Middle🔥 181 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Принципы транзакций: Полное руководство

Транзакции — это фундамент надёжной работы с базами данных. Давайте разберём основные принципы, которые гарантируют целостность и консистентность данных.

ACID-свойства

ACID — это четыре ключевых свойства, которые должна обеспечивать любая надёжная система управления базами данных:

1. Atomicity (Атомарность)

Транзакция либо полностью выполняется, либо полностью откатывается. Нет промежуточных состояний. Если произойдёт сбой после половины операций, все изменения откатятся.

// Пример: перевод денег между счётами
async function transferMoney(fromId, toId, amount) {
  const transaction = await db.transaction();
  try {
    await transaction.query(
      "UPDATE accounts SET balance = balance - $1 WHERE id = $2",
      [amount, fromId]
    );
    
    // Если здесь произойдёт ошибка, оба UPDATE откатятся
    await transaction.query(
      "UPDATE accounts SET balance = balance + $1 WHERE id = $2",
      [amount, toId]
    );
    
    await transaction.commit();
  } catch (error) {
    await transaction.rollback();
    throw error;
  }
}

2. Consistency (Консистентность)

База данных переходит из одного согласованного состояния в другое. Все определённые ограничения (PRIMARY KEY, FOREIGN KEY, CHECK) соблюдаются. Данные не могут быть в неправильном состоянии.

3. Isolation (Изоляция)

Одновременно выполняемые транзакции не мешают друг другу. Изменения, которые сделала одна транзакция, не видны другим, пока та не завершится. Есть разные уровни изоляции:

  • READ UNCOMMITTED — самый слабый, может привести к грязному чтению
  • READ COMMITTED — защита от грязного чтения (обычно по умолчанию)
  • REPEATABLE READ — защита от грязного чтения и неповторяемого чтения
  • SERIALIZABLE — полная изоляция, самый безопасный
// Установка уровня изоляции
await db.query("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");

4. Durability (Долговечность)

После завершения (commit) транзакции данные сохраняются постоянно, даже при сбоях БД, потерях питания и т.п. Записываются в WAL (Write-Ahead Log).

Проблемы, которые решают транзакции

1. Грязное чтение (Dirty Read) Одна транзакция читает не закоммиченные данные другой транзакции, которая потом откатится.

2. Неповторяемое чтение (Non-repeatable Read) Одна транзакция дважды читает одно и то же значение, но между чтениями другая транзакция его изменила.

3. Фантомное чтение (Phantom Read) Транзакция дважды выполняет одну и ту же выборку по условию, но между запросами другая транзакция добавила/удалила строки, удовлетворяющие условию.

Практические рекомендации

  • Держи транзакции короткими — чем дольше транзакция, тем выше риск конфликтов
  • Избегай deadlockов — приобретай блокировки в одинаковом порядке
  • Используй индексы — они помогают БД быстрее находить нужные данные и уменьшают время блокировки
  • Логируй транзакции — это помогает в отладке и аудите
  • Тестируй конкурентный доступ — проверь поведение при одновременных операциях

Транзакции в Node.js приложениях

При работе с популярными БД библиотеками (pg, mysql2, sequelize, knex) убедись, что ты правильно управляешь транзакциями и не допускаешь утечек соединений.

Принципы ACID — это не просто теория, это практическая необходимость для надёжных систем, особенно при работе с финансовыми данными, инвентаризацией и другими критическими данными.

Какие знаешь принципы транзакций? | PrepBro