Зачем нужны транзакции в базах данных?

Ответ

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

Транзакции гарантируют соблюдение принципов ACID:

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

Пример перевода денег в Go:

// db - это ваше соединение с БД (*sql.DB)
tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}

// Снимаем деньги с одного счета
_, err = tx.Exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
if err != nil {
    // Если ошибка, откатываем все изменения
    tx.Rollback()
    return
}

// Зачисляем на другой счет
_, err = tx.Exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
if err != nil {
    // Если здесь ошибка, первая операция тоже будет отменена
    tx.Rollback()
    return
}

// Если все прошло успешно, применяем изменения
err = tx.Commit()
if err != nil {
    log.Fatal(err)
}