0Pricing
Go Academy · レッスン

トランザクションとマイグレーション

BEGIN/COMMITのパターンとスキーママイグレーション

「トランザクションとマイグレーション」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

database/sqlのトランザクション

db.BeginTxで処理をトランザクションにまとめます。最後にコミットまたはロールバックし、パニックにも対応できるよう、必ずロールバックをdeferします。

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を使用してください。

Rollbackをdeferするパターン

BeginTxの直後にロールバックをdeferします。Commitが成功すれば、その後のロールバックは何もしません。Commitが失敗した場合は、ロールバックによって変更が取り消されます。

tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback() // safe no-op after successful Commit

セーブポイント

トランザクション内でセーブポイントを使用すると、部分的なロールバックを実行できます(raw SQLを介したPostgreSQL固有の機能です)。

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関数によるマイグレーションの両方に対応し、up/downコマンドを提供する、もう1つの人気の高いマイグレーションライブラリです。

goose.Up(db, "migrations")

スキーマ管理のためのAtlas

Atlasは宣言的なスキーマ管理を提供します。目的のスキーマ状態を定義すると、Atlasが差分を計算し、マイグレーションスクリプトを自動生成します。

起動時にマイグレーションを実行する

デプロイ時にスキーマが最新の状態になるよう、サーバーを起動する前にmainでプログラムからマイグレーションを実行します。

if err := runMigrations(db); err != nil { log.Fatal(err) }

マイグレーションのベストプラクティス

各マイグレーションは、1つの関心事に絞り、前方互換性を持つ追加的な変更にします。カラムをすぐに削除してはいけません。非推奨としてマークし、コードから参照されなくなった後の、後続のマイグレーションで削除します。

クイックチェック

なぜBeginTxの直後には、必ずtx.Rollback()をdeferする必要があるのでしょうか。

まとめ:トランザクションとマイグレーション

重要なポイント:

  • BeginTx → defer Rollback → 処理 → Commit
  • *sql.Txをヘルパーに渡し、db.ExecContextではなくtx.ExecContextを使用します
  • バージョン管理されたSQLマイグレーションにはgolang-migrateまたはgooseを使用します
  • 起動時にマイグレーションを実行し、各マイグレーションは追加的な変更にします

よくある質問

「トランザクションとマイグレーション」レッスンは無料ですか?

はい。「トランザクションとマイグレーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「トランザクションとマイグレーション」で何を学びますか?

BEGIN/COMMITのパターンとスキーママイグレーション ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「トランザクションとマイグレーション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. database/sqlとドライバー
  2. sqlx:構造体スキャンと名前付きクエリ
  3. pgx:高性能PostgreSQLドライバー
  4. トランザクションとマイグレーション
← Go Academyに戻る