GORM 默认在事务中执行单个 createupdatedelete 操作,以确保数据库数据完整性。

如果你想将多个 createupdatedelete 当成一个原子性操作,Transaction 就是为了这个而创造的。

事务

要在事务中执行一组操作,正常的流程如下所示。

// 开启事务
tx := db.Begin()

// 在事务中执行一些数据库操作 (从这里开始使用 'tx',而不是 'db')
tx.Create(...)

// ...

// 发生错误回滚事务
tx.Rollback()

// 或者提交这个事务
tx.Commit()

具体例子

func CreateAnimals(db *gorm.DB) err {
  // 注意在事务中要使用 tx 作为数据库句柄
  tx := db.Begin()
  defer func() {
    if r := recover(); r != nil {
      tx.Rollback()
    }
  }()

  if tx.Error != 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
}
文档更新时间: 2020-06-02 13:10   作者:kuteng