脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go GORM 事务详细介绍

Go GORM 事务详细介绍

2022-07-31 10:22v2v1 Golang

这篇文章主要介绍了Go GORM事务详细介绍,GORM 会在事务里执行写入操作创建、更新、删除,具体详细介绍需要的朋友可以参考下面文章的简单介绍

禁用默认事务

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

?
1
2
3
4
5
6
7
8
9
10
// 全局禁用
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)

事务

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 支持嵌套事务,您可以回滚较大事务内执行的一部分操作,例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

手动事务

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// 开始事务
tx := db.Begin()
 
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
tx.Create(...)
 
// ...
 
// 遇到错误时回滚事务
tx.Rollback()
 
// 否则,提交事务
tx.Commit()

一个特殊的示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 来提供保存点以及回滚至保存点,例如:

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

到此这篇关于Go GORM 事务详细介绍的文章就介绍到这了,更多相关Go GORM 事务 内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://learnku.com/docs/gorm/v2/transactions/9745

延伸 · 阅读

精彩推荐
  • Golang使用gin框架搭建简易服务的实现方法

    使用gin框架搭建简易服务的实现方法

    go语言web框架挺多的,本文就介绍了一下如何使用gin框架搭建简易服务的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小...

    可可巧克力5162022-01-22
  • Golang在Golang中使用http.FileServer返回静态文件的操作

    在Golang中使用http.FileServer返回静态文件的操作

    这篇文章主要介绍了在Golang中使用http.FileServer返回静态文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    寒江雪17195892021-03-06
  • Golang一百行Golang代码实现简单并发聊天室

    一百行Golang代码实现简单并发聊天室

    这篇文章主要为大家详细介绍了一百行Golang代码如何实现简单并发聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    Go-Bluer5132020-05-27
  • GolangGo中使用加密算法的方法

    Go中使用加密算法的方法

    本文通过实例代码给大家介绍go中使用加密算法的方法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...

    你是魔鬼吧5302021-09-16
  • GolangGo语言正则表达式的使用详解

    Go语言正则表达式的使用详解

    正则表达式是一种进行模式匹配和文本操纵的功能强大的工具。这篇文章主要介绍了Go正则表达式使用,本文给大家介绍的非常详细,对大家的工作或学习具...

    大漠胡萝卜3082020-06-06
  • Golang详解使用Go添加Nginx代理的方法示例

    详解使用Go添加Nginx代理的方法示例

    这篇文章主要介绍了详解使用Go添加Nginx代理的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    帅气猫咪8082020-05-29
  • GolangGolang排列组合算法问题之全排列实现方法

    Golang排列组合算法问题之全排列实现方法

    这篇文章主要介绍了Golang排列组合算法问题之全排列实现方法,涉及Go语言针对字符串的遍历及排列组合相关操作技巧,需要的朋友可以参考下 ...

    books19585682020-05-05
  • Golang利用Golang如何调用Linux命令详解

    利用Golang如何调用Linux命令详解

    这篇文章主要给大家介绍了Golang中使用os/exec来执行 Linux 命令的相关资料,文中给出了详细的示例代码,对大家具有一定的参考学习价值,需要的朋友们下...

    田飞雨的网站12532020-05-06