GORMはデフォルトで1つのcreate
, update
, delete
操作をトランザクション内で行います。これはデータベース上のデータ整合性を確保するためです。
複数の create
, update
, delete
を1つの不可分操作として扱いたい場合は、 Transaction
が向いています。
トランザクション
トランザクション内で複数操作をまとめて実行するための、一般的なフローは以下の通りです。
func CreateAnimals(db *gorm.DB) error { return db.Transaction(func(tx *gorm.DB) error { if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { return err }
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { return err }
return nil }) }
|
手動でのトランザクション
tx := db.Begin()
tx.Create(...)
tx.Rollback()
tx.Commit()
|
具体例
func CreateAnimals(db *gorm.DB) error { tx := db.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() } }()
if err := tx.Error; err != nil { return err }
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { tx.Rollback() return err }
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { tx.Rollback() return err }
return tx.Commit().Error }
|