Что такое ACID в контексте баз данных?

«Что такое ACID в контексте баз данных?» — вопрос из категории Базы данных, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ACID — это набор критически важных свойств, гарантирующих надежность и предсказуемость транзакций в базе данных, особенно в реляционных СУБД, таких как PostgreSQL или MySQL, которые часто используются с Node.js.

  • A (Atomicity) — Атомарность. Транзакция выполняется как единое целое. Либо выполняются все её операции, либо ни одна. Невозможно частичное выполнение. В Node.js с node-postgres это достигается через BEGIN, COMMIT и ROLLBACK.
  • C (Consistency) — Согласованность. Каждая успешная транзакция переводит базу данных из одного валидного состояния в другое. Это означает соблюдение всех правил целостности: типов данных, внешних ключей, уникальности и т.д.
  • I (Isolation) — Изолированность. Параллельно выполняющиеся транзакции не должны влиять друг на друга. Уровни изоляции (Read Uncommitted, Read Committed, Repeatable Read, Serializable) определяют степень этой изоляции и баланс между целостностью и производительностью.
  • D (Durability) — Долговечность. После успешного завершения транзакции (COMMIT) внесенные изменения сохраняются на диске и не могут быть потеряны даже из-за сбоя системы.

Практический пример на Node.js с PostgreSQL:

import { Client } from 'pg';
const client = new Client();
await client.connect();

try {
  // Начало транзакции
  await client.query('BEGIN');

  // Две связанные операции перевода денег
  await client.query(
    'UPDATE accounts SET balance = balance - $1 WHERE id = $2',
    [100, 1]
  );
  await client.query(
    'UPDATE accounts SET balance = balance + $1 WHERE id = $2',
    [100, 2]
  );

  // Фиксация изменений (Atomicity и Durability)
  await client.query('COMMIT');
  console.log('Транзакция успешно завершена');
} catch (err) {
  // При любой ошибке — откат (Atomicity)
  await client.query('ROLLBACK');
  console.error('Транзакция откачена:', err);
} finally {
  await client.end();
}

В этом примере ACID гарантирует, что деньги не "потеряются" при сбое между двумя UPDATE, и что баланс не уйдет в минус (благодаря constraints — Consistency).

Видео-ответы