Go GORM 事务详细介绍

作者:v2v1 时间:2024-02-21 21:03:05 

禁用默认事务

为了确保数据一致性,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

来源:https://learnku.com/docs/gorm/v2/transactions/9745

标签:Go,GORM,事务
0
投稿

猜你喜欢

  • ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法

    2024-04-17 10:39:54
  • 用MySQL做站点时如何记录未知错误的发生

    2010-09-30 14:11:00
  • python paramiko模块学习分享

    2021-11-10 16:57:00
  • js清空form表单中的内容示例

    2023-08-23 16:22:02
  • vue-form表单验证是否为空值的实例详解

    2024-04-30 10:40:03
  • 分享给Python新手们的几道简单练习题

    2021-08-01 22:05:14
  • Django实现自定义路由转换器

    2021-09-10 05:49:04
  • 用mysql做站点时怎样记录未知错误的发生

    2009-01-14 13:16:00
  • Go语言操作数据库及其常规操作的示例代码

    2024-01-14 07:05:46
  • Python使用shutil操作文件、subprocess运行子程序

    2021-03-01 00:19:19
  • Python 操作文件的基本方法总结

    2021-11-29 03:18:27
  • lodash内部方法getData和setData实例解析

    2024-04-19 09:43:12
  • Python采集图片数据的实现示例

    2023-03-06 05:53:17
  • python中的decorator的作用详解

    2021-05-24 16:44:40
  • Python基础常用内建函数图文示例解析

    2022-05-04 04:54:24
  • XMLHTTP错误The server name or address could not be resolved 的解决过程

    2009-12-26 18:33:00
  • JavaScript实现获取select下拉框中第一个值的方法

    2024-04-22 12:50:05
  • pandas groupby 分组取每组的前几行记录方法

    2021-06-19 05:52:20
  • Vue实现登录以及登出详解

    2023-07-02 16:59:51
  • python实现自动抢课脚本的示例代码

    2022-03-12 08:16:19
  • asp之家 网络编程 m.aspxhome.com