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

Использовали ли вы в своих проектах механизмы управления транзакциями в SQL базах данных?

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

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

sobes.tech AI

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

Да, транзакции использовались в проектах там, где несколько операций должны быть выполнены атомарно. Обычно это сценарии с записью в несколько таблиц, списанием/начислением баланса или согласованным обновлением связанных данных. Важно уметь объяснить, зачем нужны commit и rollback, и как транзакции помогают сохранить целостность данных.

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

Транзакция в SQL — это набор операций, который выполняется как единое целое. Если все шаги прошли успешно, изменения фиксируются; если на любом шаге произошла ошибка, все изменения откатываются. Это защищает данные от частично применённых изменений и нарушений целостности.

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

Например, при оформлении заказа нужно создать запись заказа, списать товар со склада и записать платеж. Если списание со склада не удалось, заказ не должен остаться в базе в полуготовом состоянии.

using var connection = new SqlConnection(connectionString);
connection.Open();

using var transaction = connection.BeginTransaction();

try
{
    var createOrderCommand = connection.CreateCommand();
    createOrderCommand.Transaction = transaction;
    createOrderCommand.CommandText = @"
        INSERT INTO Orders (CustomerId, Total) VALUES (@CustomerId, @Total)";
    createOrderCommand.Parameters.AddWithValue("@CustomerId", customerId);
    createOrderCommand.Parameters.AddWithValue("@Total", total);
    createOrderCommand.ExecuteNonQuery();

    var updateStockCommand = connection.CreateCommand();
    updateStockCommand.Transaction = transaction;
    updateStockCommand.CommandText = @"
        UPDATE Products SET Stock = Stock - @Count WHERE Id = @ProductId";
    updateStockCommand.Parameters.AddWithValue("@Count", count);
    updateStockCommand.Parameters.AddWithValue("@ProductId", productId);
    updateStockCommand.ExecuteNonQuery();

    transaction.Commit();
}
catch
{
    transaction.Rollback();
    throw;
}

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

Сначала открывается соединение с базой, затем создаётся транзакция. Оба SQL-запроса выполняются внутри одной транзакции через привязку Transaction = transaction. Если оба запроса завершаются успешно, вызывается Commit(), и изменения сохраняются. Если возникает исключение, выполняется Rollback(), и база возвращается к исходному состоянию. Так исключается ситуация, когда заказ создан, а склад не обновлён.

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

  • Транзакции используют там, где операции должны быть согласованы и атомарны.
  • Основные действия: commit для фиксации и rollback для отката.
  • Транзакция особенно важна при работе с несколькими таблицами или денежными операциями.
  • В C# важно выполнять все команды в рамках одного соединения и одной транзакции.
  • Ошибки нужно обрабатывать через try/catch, а откат делать в catch.
  • Транзакция снижает риск неконсистентных данных, но может держать блокировки и влиять на конкуренцию за ресурсы.