> Что такое транзакции в базах данных и для чего они нужны (Python)

Уровень: junior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Wildberries, ИП Калюков Николай Сергеевич, JetLend, praktika.ai, EVRAZ

Стек: Python

> Пример ответа

Короткий ответ

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

Подробное объяснение

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

Основные свойства ACID:

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

В Python с БД транзакции обычно управляются через библиотеки типа psycopg2, sqlite3 или ORM (SQLAlchemy, Django ORM). По умолчанию во многих драйверах транзакция начинается неявно при первой операции, а завершается явным commit или rollback.

На практике

В реальном backend-коде транзакции критичны для операций, которые затрагивают несколько таблиц или записей. Например:

  • перевод денег между счетами
  • создание заказа и списание товара со склада
  • регистрация пользователя с созданием профиля и настроек

Важно понимать, что транзакции не бесплатны: они блокируют ресурсы и увеличивают время выполнения. Поэтому не стоит оборачивать в транзакцию длительные операции или операции, которые не требуют атомарности.

Также нужно помнить про уровни изоляции (read committed, repeatable read, serializable) - они определяют, как транзакции видят изменения друг друга. Выбор уровня зависит от требований к консистентности и производительности.

Пример кода

PYTHON
import sqlite3
conn = sqlite3.connect("bank.db")
cursor = conn.cursor()
try:
# начинаем транзакцию явно
conn.execute("BEGIN")
cursor.execute(
"UPDATE accounts SET balance = balance - 500 WHERE id = 1"
)
cursor.execute(
"UPDATE accounts SET balance = balance + 500 WHERE id = 2"
)
# если обе операции прошли успешно - фиксируем
conn.commit()
print("Перевод выполнен")
except Exception as e:
# при ошибке откатываем все изменения
conn.rollback()
print(f"Ошибка, откат транзакции: {e}")
finally:
conn.close()

В этом примере, если второе обновление упадёт (например, из-за ограничения), первое тоже будет отменено - баланс останется корректным.

Как отвечать на собеседовании

Начни с определения и главной цели - обеспечение целостности данных. Затем перечисли свойства ACID и объясни каждое на простом примере. Обязательно упомяни, что транзакции нужны для конкурентного доступа и обработки сбоев. Если спросят про практику - приведи пример из своего опыта или типовой сценарий (перевод денег). Покажи понимание trade-off: транзакции дают надёжность, но стоят производительности.

Что проверяет интервьюер

  • Понимание базового определения и назначения транзакций
  • Знание свойств ACID и умение объяснить их своими словами
  • Понимание разницы между commit и rollback
  • Осознание проблем конкурентного доступа (dirty read, lost update)
  • Умение применить транзакции в реальном коде на Python

Типичные ошибки

  • Путаница между транзакцией и блокировкой - это разные механизмы, хотя они связаны
  • Утверждение, что транзакции всегда повышают производительность - на деле они её снижают
  • Забывают про rollback в блоке except - без него при ошибке изменения могут остаться
  • Не учитывают уровень изоляции по умолчанию в конкретной БД
  • Оборачивают в транзакцию операции, которые не требуют атомарности, например простые SELECT-запросы

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью