当前位置:   article > 正文

GORM中事务的使用_gorm 事务

gorm 事务

事务 | 教程 |《GORM 中文文档 v2》| Go 技术论坛 禁用默认事务 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。 // 全局禁用 db, err := gorm.Open(sqlite.Ope...icon-default.png?t=N7T8https://learnku.com/docs/gorm/v2/transactions/9745

禁用默认事务

为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。

  1. // 全局禁用
  2. db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  3.   SkipDefaultTransaction: true,
  4. })
  5. // 持续会话模式
  6. tx := db.Session(&Session{SkipDefaultTransaction: true})
  7. tx.First(&user, 1)
  8. tx.Find(&users)
  9. tx.Model(&user).Update("Age", 18)


事务


要在事务中执行一系列操作,一般流程如下:

  1. db.Transaction(func(tx *gorm.DB) error {
  2.   // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  3.   if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
  4.     // 返回任何错误都会回滚事务
  5.     return err
  6.   }
  7.   if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
  8.     return err
  9.   }
  10.   // 返回 nil 提交事务
  11.   return nil
  12. })


嵌套事务


GORM 支持嵌套事务,您可以回滚较大事务内执行的一部分操作,例如:

  1. db.Transaction(func(tx *gorm.DB) error {
  2.   tx.Create(&user1)
  3.   tx.Transaction(func(tx2 *gorm.DB) error {
  4.     tx2.Create(&user2)
  5.     return errors.New("rollback user2") // Rollback user2
  6.   })
  7.   tx.Transaction(func(tx2 *gorm.DB) error {
  8.     tx2.Create(&user3)
  9.     return nil
  10.   })
  11.   return nil
  12. })
  13. // Commit user1, user3


手动事务

  1. // 开始事务
  2. tx := db.Begin()
  3. // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  4. tx.Create(...)
  5. // ...
  6. // 遇到错误时回滚事务
  7. tx.Rollback()
  8. // 否则,提交事务
  9. tx.Commit()
  10. 一个特殊的示例
  11. func CreateAnimals(db *gorm.DB) error {
  12.   // 再唠叨一下,事务一旦开始,你就应该使用 tx 处理数据
  13.   tx := db.Begin()
  14.   defer func() {
  15.     if r := recover(); r != nil {
  16.       tx.Rollback()
  17.     }
  18.   }()
  19.   if err := tx.Error; err != nil {
  20.     return err
  21.   }
  22.   if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
  23.      tx.Rollback()
  24.      return err
  25.   }
  26.   if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
  27.      tx.Rollback()
  28.      return err
  29.   }
  30.   return tx.Commit().Error
  31. }


SavePoint、RollbackTo


GORM 提供了 SavePoint、Rollbackto 来提供保存点以及回滚至保存点,例如:

  1. tx := db.Begin()
  2. tx.Create(&user1)
  3. tx.SavePoint("sp1")
  4. tx.Create(&user2)
  5. tx.RollbackTo("sp1") // Rollback user2
  6. tx.Commit() // Commit user1



原文作者:Go 技术论坛文档:《GORM 中文文档(v2)》
转自链接:https://learnku.com/docs/gorm/v2/transactions/9745
版权声明:翻译文档著作权归译者和 LearnKu 社区所有。转载请保留原文链接

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/1021969
推荐阅读
相关标签
  

闽ICP备14008679号