Go GORM事务实例分析

这篇文章主要介绍“GoGORM事务实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GoGORM事务实例分析”文章能帮助大家解决问题。禁用默认事务为了确保数据一致性,GO

这篇文章主要介绍“Go GORM事务实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go GORM事务实例分析”文章能帮助大家解决问题。

    禁用默认事务

    为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 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 {
      // 在事务中执行一些 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(tx2 *gorm.DB) error {
        tx2.Create(&user3)
        return nil
      })
    
      return nil
    })
    // Commit user1, user3

    手动事务

    // 开始事务
    tx := db.Begin()
    
    // 在事务中执行一些 db 操作(从这里开始,您应该使用 '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
    }

    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

    关于“Go GORM事务实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡网行业资讯频道,小编每天都会为大家更新不同的知识点。

    本站部分文章来自网络或用户投稿,如无特殊说明或标注,均为本站原创发布。涉及资源下载的,本站旨在共享仅供大家学习与参考,如您想商用请获取官网版权,如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
    开发者

    MySQL关系型数据库事务的ACID特性与实现方法

    2022-8-3 21:11:14

    开发者

    element-ui中el-form如何自定义验证

    2022-8-3 21:11:16

    搜索