Ответ
Транзакция — это последовательность операций с базой данных, которая рассматривается как единая логическая единица работы. Главная цель транзакций — обеспечить целостность и согласованность данных, даже при одновременном доступе или сбоях.
Транзакции гарантируют соблюдение принципов 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)
}