如何在golang中使用transaction



我有一个到db
的代码插入,这是我的模型:

func (samethodattach *Product_gallery) SaveGalleri(db *gorm.DB) (*Product_gallery, error) {
var err error
err = db.Debug().Create(&samethodattach).Error
if err != nil {
return &Product_gallery{}, err
}
return samethodattach, nil
}

并且我想使用插入中的事务。

这方面有一些要点:

禁用默认事务

如果不需要,您可以在初始化期间禁用它,之后您将获得大约30%以上的性能改进。

// Globally disable
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true,
})
// Continuous session mode
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 {
// do some database operations in the transaction (use 'tx' from this point, not 'db')
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// return any error will rollback
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
return err
}
// return nil will commit the whole transaction
return nil
})

手动控制交易

此外,Gorm支持手动事务,Gorm提供SavePointRollbackTo以保存点并回滚到保存点,例如:如下所示:

// begin a transaction
tx := db.Begin()
// do some database operations in the transaction (use 'tx' from this point, not 'db')
tx.Create(...)
// ...
// rollback the transaction in case of error
tx.Rollback()
// Or commit the transaction
tx.Commit()

示例

func CreateAnimals(db *gorm.DB) error {
// Note the use of tx as the database handle once you are within a transaction
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
}

相关内容

  • 没有找到相关文章

最新更新