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 提供了 SavePoint
、Rollbackto
来提供保存点以及回滚至保存点,例如:
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,事务
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
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
![](https://img.aspxhome.com/file/2023/5/75075_0s.png)
python中的decorator的作用详解
2021-05-24 16:44:40
Python基础常用内建函数图文示例解析
2022-05-04 04:54:24
![](https://img.aspxhome.com/file/2023/9/93539_0s.png)
XMLHTTP错误The server name or address could not be resolved 的解决过程
2009-12-26 18:33:00
JavaScript实现获取select下拉框中第一个值的方法
2024-04-22 12:50:05
![](https://img.aspxhome.com/file/2023/7/136087_0s.png)
pandas groupby 分组取每组的前几行记录方法
2021-06-19 05:52:20
Vue实现登录以及登出详解
2023-07-02 16:59:51
![](https://img.aspxhome.com/file/2023/7/139877_0s.png)
python实现自动抢课脚本的示例代码
2022-03-12 08:16:19
![](https://img.aspxhome.com/file/2023/5/128635_0s.png)