0Pricing
Go Academy · Урок

Транзакции и миграции

Шаблоны 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 migrations

goose

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 — локальная установка не требуется.

Все уроки этого курса

  1. database/sql и драйверы
  2. sqlx: сканирование структур и именованные запросы
  3. pgx: высокопроизводительный драйвер PostgreSQL
  4. Транзакции и миграции
← Назад к Go Academy