InfoSphere/GORM 中文版/ 返回书籍
Tutorials

Transactions

qianmoQqianmoQ· 更新于 2026-09-15· 阅读 7 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Disable Default Transaction

GORM perform write (create/update/delete) operations run inside a transaction to ensure data consistency, you can disable it during initialization if it is not required, you will gain about 30%+ performance improvement after that


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)

Transaction

To perform a set of operations within a transaction, the general flow is as below.

Generics API

ctx := context.Background()


err := db.Transaction(func(tx *gorm.DB) error {
  
  if err := gorm.G[Animal](tx).Create(ctx, &Animal{Name: "Giraffe"}); err != nil {
    
    return err
  }

  if err := gorm.G[Animal](tx).Create(ctx, &Animal{Name: "Lion"}); err != nil {
    return err
  }

  
  return nil
})

Traditional API

db.Transaction(func(tx *gorm.DB) error {
  
  if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
    
    return err
  }

  if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
    return err
  }

  
  return nil
})

Nested Transactions

GORM supports nested transactions, you can rollback a subset of operations performed within the scope of a larger transaction, for example:

db.Transaction(func(tx *gorm.DB) error {
  tx.Create(&user1)

  tx.Transaction(func(tx2 *gorm.DB) error {
    tx2.Create(&user2)
    return errors.New("rollback user2") 
  })

  tx.Transaction(func(tx3 *gorm.DB) error {
    tx3.Create(&user3)
    return nil
  })

  return nil
})

Control the transaction manually

Gorm supports calling transaction control functions (commit / rollback) directly, for example:


tx := db.Begin()


tx.Create(...)




tx.Rollback()


tx.Commit()

A Specific Example

func CreateAnimals(db *gorm.DB) error {
  
  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
}

SavePoint, RollbackTo

GORM provides SavePoint, RollbackTo to save points and roll back to a savepoint, for example:

tx := db.Begin()
tx.Create(&user1)

tx.SavePoint("sp1")
tx.Create(&user2)
tx.RollbackTo("sp1") 

tx.Commit() 

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…