如何在Golang中使用事务

huangapple go评论91阅读模式
英文:

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提供了SavePointRollbackTo来保存和回滚到保存点,例如:

// 开始一个事务
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
}

huangapple
  • 本文由 发表于 2022年11月1日 11:44:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/74271320.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定