Go言語でDB開発を行う際、重要になるのが「トランザクション処理」です。
複数のSQL処理を安全に実行するために、実務では必須の知識になります。
本記事では、Goでのトランザクション処理について「基本・実装方法・実務でのベストプラクティス」を初心者向けに解説します。
トランザクションとは?
トランザクションとは👇
👉 複数の処理を“まとめて成功・失敗”させる仕組み
なぜ必要なのか?
例えば👇
- 残高減算
- 残高加算
片方だけ成功すると不整合が発生します。
👉 これを防ぐのがトランザクション
基本の流れ
Begin
↓
SQL実行
↓
Commit or Rollback
database/sqlでの実装
tx, err := db.Begin()
if err != nil {
return err
}
SQL実行
_, err = tx.Exec(
"UPDATE users SET point = point - 100 WHERE id = ?",
1,
)
Commit
err = tx.Commit()
👉 成功時に確定
Rollback
tx.Rollback()
👉 エラー時に戻す
実務向けパターン
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Rollback()
_, err = tx.Exec(...)
if err != nil {
return err
}
return tx.Commit()
👉 defer Rollbackが鉄板
GORMでのトランザクション
GORM
tx := db.Begin()
GORM Commit
tx.Commit()
GORM Rollback
tx.Rollback()
実務で重要なポイント
✔ ACID特性
| 項目 | 意味 |
|---|---|
| Atomicity | 原子性 |
| Consistency | 一貫性 |
| Isolation | 独立性 |
| Durability | 永続性 |
✔ Rollback忘れ防止
defer tx.Rollback()
✔ 長時間Transaction禁止
👉 DBロック原因になる
実務での応用
- 決済処理
- ポイント管理
- 会員登録
- 在庫管理
よくある失敗
❌ Commit忘れ
❌ Rollback未実装
❌ Transaction長すぎ問題
ベストプラクティス
- defer Rollback
- 必要最小限の処理
- エラー即終了
- DBロック意識
💡 結論
👉
「トランザクション品質=システム品質」


コメント