golang gorm —— 事务、回滚、savepoint

2023-10-11 06:28

本文主要是介绍golang gorm —— 事务、回滚、savepoint,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

gorm事务

model定义

type Roles []stringtype Teacher struct {gorm.ModelName     string   `gorm:"size:256"`Email    string   `gorm:"size:256"`Salary   float64  `gorm:"scale:2;precision:7"`   // 指定小数部分宽度为2,列宽度为7. 列宽:【整数部分+小数部分的总长度】【不含小数点】Age      uint8    `gorm:"check:age>30"`Birthday int64    `gorm:"serializer:unixtime;type:time"`  // 反序列化方式 unixtime, 类型为timeRoles    Roles    `gorm:"serializer:json"`JobInfo  Job      `gorm:"embedded;embeddedPrefix:job_"`   // 嵌套字段, 嵌入字段的列名前缀job_JobInfo2 Job      `gorm:"type:bytes;serializer:gob"`      // 字节流类型,gob反序列化,go自己的序列化方法,跨语言项目的时候,不建议用
}type Job struct {Title    stringLocation string
}type Course struct {gorm.ModelName   string  `gorm:"size:256"`Price  float64 `gorm:"scale:2;precision:7"`UserID uint    `gorm:"type:int"`
}
自动事务

gorm提供了自动事务的机制,不需要我们手动提交和回滚

func Transaction() {t := Teacher{Name:   "yuan",Age:    41,Salary: 122345.123,Email:  "yuan@test.com",}c := Course{Name:  "golang",Price: 12345.1234,}DB.Transaction(func(tx *gorm.DB) error {if err := tx.Create(&t).Error; err != nil {// 返回err 会自动回滚事务return err}c.UserID = t.IDif err := tx.Create(&c).Error; err != nil {return err}// 返回nil 则提交事务return nil})
}
嵌套事务

gorm事务可以嵌套,大事务里嵌套小事务,只有大事务成功提交,必须大事务提交成功,内部嵌套的事务才能提交成功。如果失败了,可以回滚嵌套的事务。

注意:嵌套事务不应在gorm中大量使用,因为其不支持预编译

func NestTransaction() {t := Teacher{Name:   "yuan",Age:    41,Salary: 122345.123,Email:  "yuan@test.com",}t1 := Teacher{Name:   "yuan2",Age:    40,Salary: 12345.123,Email:  "yuan@test.com",,}t2 := Teacher{Name:   "yuan3",Age:    50,Salary: 12345.123,Email:  "yuan@test.com",,}DB.Transaction(func(tx *gorm.DB) error {if err := tx.Create(&t).Error; err != nil {return err}tx.Transaction(func(tx1 *gorm.DB) error {if err := tx1.Create(&t1).Error; err != nil {return err}return nil})tx.Transaction(func(tx1 *gorm.DB) error {if err := tx1.Create(&t2).Error; err != nil {return err}return nil})return nil})
}
手动事务

gorm也提供了begin, rollback等接口支持手动事务的操作

func ManualTransaction() {t := Teacher{Name:   "yuan",Age:    41,Salary: 122345.123,Email:  "yuan@test.com",}c := Course{Name:  "golang",Price: 12345.1234,}tx := DB.Begin()defer func() {if err := recover(); err != nil {tx.Rollback()}}()if tx.Error != nil {log.Fatal(tx.Error)return}if err := tx.Create(&t).Error; err != nil {tx.Rollback()return}c.UserID = t.IDif err := tx.Create(&c).Error; err != nil {tx.Rollback()return}tx.Commit()
}
检查点savePoint

gorm也提供了savePoint的机制来支持事务的分段提交,回滚到某个特定的savePoint(RollbackTo)

func SavePointTransaction() {t := Teacher{Name:   "yuan",Age:    41,Salary: 122345.123,Email:  "yuan@test.com",}c := Course{Name:  "golang",Price: 12345.1234,}tx := DB.Begin()defer func() {if err := recover(); err != nil {tx.Rollback()}}()if tx.Error != nil {log.Fatal(tx.Error)return}if err := tx.Create(&t).Error; err != nil {tx.Rollback()return}// 创建savepointtx.SavePoint("teacher")c.UserID = t.IDif err := tx.Create(&c).Error; err != nil {// 回滚到对应savepointtx.RollbackTo("teacher")return}tx.Commit()
}

这篇关于golang gorm —— 事务、回滚、savepoint的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/186172

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值