← Назад к вопросам

Зачем нужна транзакция в БД?

1.8 Middle🔥 183 комментариев
#Базы данных и SQL

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Назначение транзакций в базах данных

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

Ключевые причины использования транзакций (ACID)

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

1. Атомарность (Atomicity)

Транзакция выполняется полностью или не выполняется вовсе. Если на любом этапе происходит ошибка, все изменения откатываются.

using (var transaction = context.Database.BeginTransaction())
{
    try
    {
        // Списываем деньги со счета A
        accountA.Balance -= amount;
        context.Accounts.Update(accountA);
        
        // Зачисляем деньги на счет B
        accountB.Balance += amount;
        context.Accounts.Update(accountB);
        
        context.SaveChanges();
        transaction.Commit(); // Фиксируем оба изменения
    }
    catch
    {
        transaction.Rollback(); // Откатываем всё при ошибке
        throw;
    }
}

2. Согласованность (Consistency)

Транзакция переводит базу данных из одного консистентного состояния в другое, соблюдая все бизнес-правила и ограничения целостности.

3. Изоляция (Isolation)

Параллельные транзакции не должны влиять друг на друга. Уровни изоляции регулируют видимость изменений:

  • Read Uncommitted — низкая изоляция, высокая производительность
  • Read Committed — чтение только зафиксированных данных
  • Repeatable Read — защита от фантомного чтения
  • Serializable — полная изоляция, минимальная производительность
-- Установка уровня изоляции в SQL Server
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
-- Операции с данными
COMMIT TRANSACTION;

4. Долговечность (Durability)

После успешного завершения (Commit) изменения сохраняются на постоянное хранилище и не теряются при сбоях системы.

Практические сценарии применения

Финансовые операции

Банковские переводы должны быть атомарными — нельзя списать деньги с одного счета, не зачислив на другой.

Инвентаризация и складской учёт

При оформлении заказа нужно:

  • Уменьшить количество товара на складе
  • Создать запись о заказе
  • Списать средства с покупателя Все три действия должны выполниться как единое целое.

Сложные бизнес-процессы

Регистрация пользователя с созданием профиля, настроек по умолчанию и отправкой приветственного письма.

Управление транзакциями в C#

// Явное управление транзакцией в Entity Framework Core
public async Task TransferFundsAsync(int fromId, int toId, decimal amount)
{
    await using var transaction = await _context.Database.BeginTransactionAsync();
    
    try
    {
        var fromAccount = await _context.Accounts.FindAsync(fromId);
        var toAccount = await _context.Accounts.FindAsync(toId);
        
        // Бизнес-логика
        if (fromAccount.Balance < amount)
            throw new InsufficientFundsException();
        
        fromAccount.Balance -= amount;
        toAccount.Balance += amount;
        
        // Сохраняем изменения
        await _context.SaveChangesAsync();
        
        // Фиксируем транзакцию
        await transaction.CommitAsync();
    }
    catch (Exception ex)
    {
        await transaction.RollbackAsync();
        _logger.LogError(ex, "Transfer failed");
        throw;
    }
}

Проблемы без транзакций

Без транзакций возможны:

  • Частичное выполнение операций
  • Неконсистентные данные (деньги списались, но не зачислились)
  • Потерянные обновления при параллельном доступе
  • Грязное чтение — чтение незафиксированных данных других транзакций

Распределённые транзакции

Для сложных систем с несколькими базами данных или микросервисами используются распределённые транзакции (например, через паттерн Saga или двухфазный commit), которые координируют выполнение операций across multiple resources.

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

Зачем нужна транзакция в БД? | PrepBro