Sobes.tech
Назад к вопросам
Junior — Middle
52

Можешь объяснить основные свойства транзакций в базах данных, связанные с принципами ACID?

Компании, где спрашивали
Леста

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Транзакции в БД нужны, чтобы группа операций выполнялась как единое целое. ACID описывает четыре свойства, которые делают изменения предсказуемыми и безопасными: атомарность, согласованность, изоляция и долговечность. На собеседовании важно уметь кратко объяснить каждое свойство и привести понятный пример, зачем это нужно на практике.

Определение:

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

  • Atomicity (атомарность) — транзакция либо выполняется целиком, либо не выполняется вовсе.
  • Consistency (согласованность) — после завершения транзакции данные должны оставаться в корректном состоянии и не нарушать ограничения БД.
  • Isolation (изолированность) — параллельные транзакции не должны мешать друг другу так, чтобы возникали некорректные промежуточные состояния.
  • Durability (долговечность) — после успешного commit изменения не должны пропасть даже при сбое системы.

Пример использования:

Классический пример — перевод денег между счетами: нужно списать сумму с одного счета и зачислить на другой.

import sqlite3

conn = sqlite3.connect("bank.db")

try:
    cursor = conn.cursor()
    conn.execute("BEGIN")

    cursor.execute("UPDATE accounts SET balance = balance - ? WHERE id = ?", (100, 1))
    cursor.execute("UPDATE accounts SET balance = balance + ? WHERE id = ?", (100, 2))

    conn.commit()
except Exception:
    conn.rollback()
    raise
finally:
    conn.close()

Пояснение кода:

Код показывает транзакцию в Python через sqlite3.

  1. Открывается соединение с базой данных.
  2. Запускается транзакция через BEGIN.
  3. Выполняются два связанных изменения: списание с одного счета и зачисление на другой.
  4. Если обе операции успешны, вызывается commit(), и изменения сохраняются.
  5. Если на любом шаге возникает ошибка, вызывается rollback(), и база возвращается в исходное состояние.
  6. finally закрывает соединение независимо от результата.

Этот пример иллюстрирует атомарность: нельзя допустить, чтобы деньги списались, но не зачислились. Также здесь важна долговечность: после commit() данные считаются зафиксированными.

Ключевые моменты:

  • Атомарность защищает от частично выполненных изменений.
  • Согласованность означает соблюдение ограничений и бизнес-правил после транзакции.
  • Изоляция особенно важна при одновременной работе нескольких клиентов.
  • Долговечность гарантирует сохранность подтвержденных данных после commit.
  • На практике уровень изоляции и поведение транзакций зависят от конкретной СУБД.
  • Для собеседования полезно уметь привести пример с переводом денег, заказом товара или резервированием ресурса.