英文:
how to use transaction in golang
问题
我有一个插入数据库的代码,并且这是我的模型:
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
}
我想在插入操作中使用事务。
英文:
i have a code insert to db
and this my model :
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
}
and I want to use the transaction inside the insert .
答案1
得分: 2
这里有一些要点:
> 禁用默认事务
如果不需要默认事务,可以在初始化时禁用它,这样可以提高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 {
// 在事务中执行一些数据库操作(使用 'tx',而不是 'db')
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// 返回任何错误将回滚事务
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
return err
}
// 返回 nil 将提交整个事务
return nil
})
> 手动控制事务
Gorm还支持手动事务,GORM提供了SavePoint和RollbackTo来保存和回滚到保存点,例如:
// 开始一个事务
tx := db.Begin()
// 在事务中执行一些数据库操作(使用 'tx',而不是 'db')
tx.Create(...)
// ...
// 在出现错误时回滚事务
tx.Rollback()
// 或者提交事务
tx.Commit()
> 示例
func CreateAnimals(db *gorm.DB) error {
// 注意,在事务中时使用 tx 作为数据库句柄
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
}
英文:
There are some points on this:
> Disable Default Transaction
You can disable it during initialization if it is not required, after that you will gain about 30%+ performance improvement.
// 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)
> Transaction
the general flow To perform a set of operations within a transaction:
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
})
> Control transaction manually
Also Gorm support manually transaction, GORM provides SavePoint, RollbackTo to save points and roll back to a savepoint, for example: like this:
// 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()
> Example
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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论