1. 事务

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

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

1.1. 事务

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

  1. // 开启事务
  2. tx := db.Begin()
  3. // 在事务中执行一些数据库操作 (从这里开始使用 'tx',而不是 'db')
  4. tx.Create(...)
  5. // ...
  6. // 发生错误回滚事务
  7. tx.Rollback()
  8. // 或者提交这个事务
  9. tx.Commit()

1.2. 具体例子

  1. func CreateAnimals(db *gorm.DB) err {
  2. // 注意在事务中要使用 tx 作为数据库句柄
  3. tx := db.Begin()
  4. defer func() {
  5. if r := recover(); r != nil {
  6. tx.Rollback()
  7. }
  8. }()
  9. if tx.Error != nil {
  10. return err
  11. }
  12. if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
  13. tx.Rollback()
  14. return err
  15. }
  16. if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
  17. tx.Rollback()
  18. return err
  19. }
  20. return tx.Commit().Error
  21. }