G

[Golang] GORM框架 事务

RoLingG 2024-10-10

Transaction

Transaction 是 GORM 提供的一种方便的方法,用于处理自动事务。它允许你在一个闭包函数中执行一系列操作,如果所有操作都成功,事务将自动提交;如果其中任何操作失败,事务将自动回滚。这种方式的好处是开发者不需要手动管理事务的提交和回滚,简化了错误处理过程。

err := db.Transaction(func(tx *gorm.DB) error {
  // 在事务中执行一些 db 操作(从这里开始,您应该使用 '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 支持嵌套事务,您可以回滚较大事务内执行的一部分操作,例如:

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") // Rollback user2
  })

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

  return nil
})

// Commit user1, user3

db.Begin()

db.Begin() 用于手动管理事务。当你调用 db.Begin() 时,你需要自己调用 CommitRollback 来结束事务。这种方式给你更多的控制权,包括在事务中设置保存点(SavePoint)和回滚到保存点(RollbackTo)。手动事务允许你根据业务逻辑的需要,在适当的时候提交或回滚事务。

tx := db.Begin()
// 执行数据库操作
if err := tx.Error; err != nil {
    tx.Rollback()
    return err
}
return tx.Commit().Error

SavePoint、RollbackTo

GORM 提供了 SavePointRollbackto 方法,来提供保存点以及回滚至保存点功能,例如:

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

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

tx.Commit() // Commit user1

总结

  • Transaction自动事务管理,简化了错误处理。
  • db.Begin()手动事务管理,提供更多控制。
PREV
[Golang] GORM框架 CreateInBatches(批量插入)
NEXT
[Golang] GORM框架 视图

评论(0)

发布评论