禁用默认事务
为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ SkipDefaultTransaction: true, })
tx := db.Session(&Session{SkipDefaultTransaction: true}) tx.First(&user, 1) tx.Find(&users) tx.Model(&user).Update("Age", 18)
|
事务
要在事务中执行一系列操作,一般流程如下:
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 })
|
嵌套事务
GORM 支持嵌套事务,您可以回滚较大事务内执行的一部分操作,例如:
db.Transaction(func(tx *gorm.DB) error { tx.Create(&user1)
tx.Transaction(func(tx2 *gorm.DB) error { tx2.Create(&user2) return errors.New("rollback user2") })
tx.Transaction(func(tx3 *gorm.DB) error { tx3.Create(&user3) return nil })
return nil })
|
手动事务
Gorm 支持直接调用事务控制方法(commit、rollback),例如:
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 }
|
SavePoint、RollbackTo
GORM 提供了 SavePoint
、Rollbackto
方法,来提供保存点以及回滚至保存点功能,例如:
tx := db.Begin() tx.Create(&user1)
tx.SavePoint("sp1") tx.Create(&user2) tx.RollbackTo("sp1")
tx.Commit()
|