Транзакции и миграции
Шаблоны BEGIN/COMMIT и миграции схемы
«Транзакции и миграции» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Транзакции в database/sql
Оберните операции в транзакцию с помощью db.BeginTx. В конце выполните Commit или Rollback; всегда откладывайте Rollback, чтобы обработать паники.
tx, err := db.BeginTx(ctx, nil)
if err != nil { return err }
defer tx.Rollback() // no-op after Commit
_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance-100 WHERE id=$1", from)
if err != nil { return err }
_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance+100 WHERE id=$1", to)
if err != nil { return err }
return tx.Commit()Уровни изоляции транзакций
Передайте sql.TxOptions, чтобы управлять уровнем изоляции:
tx, err := db.BeginTx(ctx, &sql.TxOptions{
Isolation: sql.LevelSerializable,
ReadOnly: false,
})Использование одного Tx в разных функциях
Передавайте *sql.Tx во вспомогательные функции, чтобы все они участвовали в одной транзакции. Не вызывайте db.ExecContext внутри транзакции — используйте tx.ExecContext.
Шаблон Defer Rollback
Сразу после BeginTx отложите вызов Rollback. Если Commit выполнится успешно, последующий Rollback ничего не изменит. Если Commit завершится ошибкой, Rollback отменит внесённые изменения.
tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback() // safe no-op after successful CommitТочки сохранения
Используйте точки сохранения внутри транзакции для частичных откатов (только для PostgreSQL, через необработанный SQL):
tx.ExecContext(ctx, "SAVEPOINT sp1")
// ... work ...
tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT sp1") // partial rollbackОбзор миграций базы данных
Миграции — это версионируемые SQL-скрипты, которые постепенно изменяют схему. У каждой миграции есть направление up (применение) и down (откат).
golang-migrate
github.com/golang-migrate/migrate/v4 по порядку запускает версионируемые SQL-файлы миграций и отслеживает применённую версию в таблице schema_migrations.
m, _ := migrate.New("file://migrations", dsn)
m.Up() // apply all pending migrationsgoose
github.com/pressly/goose/v3 — ещё одна популярная библиотека миграций, поддерживающая миграции на SQL и с помощью функций Go, а также команды применения и отката.
goose.Up(db, "migrations")Atlas для управления схемой
Atlas предоставляет декларативное управление схемой: Вы задаёте желаемое состояние схемы, а Atlas автоматически вычисляет различия и создаёт скрипты миграций.
Запуск миграций при запуске приложения
Запускайте миграции программно в main до запуска сервера, чтобы при развёртывании схема была актуальной.
if err := runMigrations(db); err != nil { log.Fatal(err) }Рекомендации по миграциям
Каждая миграция должна решать одну задачу и быть совместимой с будущими версиями (то есть только добавлять возможности). Никогда не удаляйте столбцы сразу — пометьте их как устаревшие и удалите в более поздней миграции после того, как код перестанет на них ссылаться.
Быстрая проверка
Почему следует всегда сразу после BeginTx откладывать tx.Rollback()?
Повторение: транзакции и миграции
Ключевые моменты:
- BeginTx → defer Rollback → работа → Commit
- Передавайте *sql.Tx вспомогательным функциям; используйте tx.ExecContext, а не db.ExecContext
- Используйте golang-migrate или goose для версионируемых SQL-миграций
- Запускайте миграции при старте приложения; каждая миграция должна только добавлять изменения
Часто задаваемые вопросы
Урок «Транзакции и миграции» бесплатный?
Да — полный текст урока «Транзакции и миграции» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Транзакции и миграции»?
Шаблоны BEGIN/COMMIT и миграции схемы Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Транзакции и миграции»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- database/sql и драйверы
- sqlx: сканирование структур и именованные запросы
- pgx: высокопроизводительный драйвер PostgreSQL
- Транзакции и миграции