トランザクションとマイグレーション
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 migrationsgoose
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- database/sqlとドライバー
- sqlx:構造体スキャンと名前付きクエリ
- pgx:高性能PostgreSQLドライバー
- トランザクションとマイグレーション