GORM 默认会将单个的 create, update, delete操作封装在事务内进行处理,以确保数据的完整性。
如果你想把多个 create, update, delete 操作作为一个原子操作,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
 }
 
 |