Встречается на 33% собеседований по Go

Зачем нужны транзакции

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

Свойства ACID

Транзакции опираются на четыре фундаментальных свойства, известных как ACID:

  • Атомарность (Atomicity): Все операции транзакции либо полностью выполняются, либо полностью откатываются. Если любая часть транзакции не может быть завершена, вся транзакция откатывается к исходному состоянию.
  • Согласованность (Consistency): Транзакция переводит базу данных из одного согласованного состояния в другое, сохраняя все ограничения и правила (например, внешние ключи, уникальность).
  • Изолированность (Isolation): Промежуточные состояния транзакции скрыты от других транзакций. Управление видимостью изменений позволяет избежать аномалий при параллельном выполнении.
  • Долговечность (Durability): После успешного завершения транзакции её изменения сохраняются даже при сбое системы (например, через журналирование).

Зачем нужны транзакции

Транзакции решают несколько ключевых задач:

  1. Целостность данных: Гарантируют, что связанные операции не оставят данные в несогласованном состоянии. Например, при переводе средств между счетами транзакция обеспечивает, что списание с одного счёта всегда сопровождается зачислением на другой.
  2. Обработка ошибок: При возникновении ошибки (сбой оборудования, исключение в коде) транзакция автоматически откатывает все изменения, возвращая базу в исходное состояние.
  3. Конкурентный доступ: Позволяют множеству пользователей работать с базой одновременно, минимизируя проблемы вроде потерянных обновлений, грязного чтения и несогласованности.
  4. Восстановление после сбоев: СУБД использует журналы транзакций и контрольные точки для восстановления базы до последнего согласованного состояния после аварийного завершения.

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

Рассмотрим оформление заказа в интернет-магазине. Процесс включает:

  • резервирование товара;
  • уменьшение количества на складе;
  • создание счёта;
  • запись информации о доставке.

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

Подводные камни

  • Длительные транзакции могут блокировать ресурсы и снижать пропускную способность системы.
  • Уровни изоляции (Read Committed, Repeatable Read, Serializable) требуют выбора баланса между согласованностью и производительностью.
  • Вложенные транзакции поддерживаются не всеми СУБД и требуют аккуратного управления.
  • Не забывайте про обработку ошибок: в Go при работе с database/sql необходимо явно вызывать Rollback при ошибке, иначе транзакция останется открытой.

Коротко

  • Транзакции гарантируют атомарность, согласованность, изолированность и долговечность (ACID).
  • Они необходимы для целостности данных, обработки ошибок, конкурентного доступа и восстановления после сбоев.
  • Пример: перевод денег или оформление заказа — все операции должны быть выполнены вместе.
  • Используйте транзакции для групп операций, которые не могут быть частично применены.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы