当前位置: 首页 > news >正文

GORM入门:事务管理全解析(二)

一、gorm事务

Gorm提供了两种事务实现方案:通过Transaction闭包实现的自动事务管理,以及基于Begin/Commit/Rollback的手动事务控制机制。

Grom默认在事务中执行单个create、update、delete操作,以确保数据库数据完成型性。如果想将多个crete、update、delete操作当作一个操作处理,就需要用到事务。

二、手动事务控制机制实现

在手动事务模式下,需显式调用Rollback和Commit方法,并通过defer语句处理panic异常情况。代码示例如下:

    // 需要显示开启事务tx := db.Begin()// 进行异常捕获,进行事务回滚defer func() {if err := recover(); err != nil {tx.Rollback()}}()// 存储信息tx.Create(&User{Name:  "王五",Email: "11.com",Age:   29,})// 创建失败,进行事务回滚if tx.Error != nil {tx.Rollback()fmt.Printf("create user1 failed ,%v\n", tx.Error)return}tx.Create(&User{Name:  "张三",Email: "qq.com",Age:   19,})// 创建失败,进行事务回滚if tx.Error != nil {tx.Rollback()fmt.Printf("create user2 failed ,%v\n", tx.Error)return}// 提交事务if err := tx.Commit().Error; err != nil {fmt.Printf("commite failed ,%v\n", err)return}

需要显式的调用Begin、Commit、RollBack()等方法实现事务提交和错误回滚。需要注意的是,当调用db.Begin()开启事务后,后续事务处理中使用tx作为数据库句柄,所有操作必须使用同一个事务对象(tx),混用原始数据库对象(db)会导致操作超出事务范围。

三、自动事务管理

在自动事务模式下,闭包内返回错误将触发自动回滚,而返回nil则会自动提交事务。建议使用自动事务管理。代码示例如下:

    // 自动事务err := db.Transaction(func(tx *gorm.DB) error {if err := tx.Create(&User{Name: "王五", Email: "11.com", Age: 29}).Error; err != nil {// 返回错误会自动触发回滚return err}if err := tx.Create(&User{Name: "王六", Email: "112.com", Age: 39}).Error; err != nil {// 返回错误会自动触发回滚return err}// 返回nil自动提交事务return nil})

四、自动和手动事务对比

阶段自动事务模式手动事务模式
开启Transaction() 闭包Begin()
操作执行使用闭包参数 tx使用 Begin() 返回的 tx
提交/回滚触发闭包返回值控制显式调用 Commit()/Rollback()
错误处理闭包内返回 error 自动回滚需手动检查错误并回滚

五、事务高级功能

1)事务点回滚

GORM 提供了 SavePointRollbackTo 方法,用于支持事务保存点及回滚到指定保存点的功能。代码示例如下:

    tx := db.Begin()tx.Create(&User{Name: "王五", Email: "11.com", Age: 29})tx.SavePoint("sp1")tx.Create(&User{Name: "王六", Email: "112.com", Age: 39})// 回滚到保存点sp1tx.RollbackTo("sp1") // 提交第一用户信息tx.Commit()

从代码中可以看出,当事务回滚到特定保存点时,提交操作只会在保存点之前的数据上生效。

2)事务嵌套

可以在一项主事务中嵌套一个或多个子事务 ,代码示例如下:

    db.Transaction(func(tx *gorm.DB) error {tx.Create(&User{Name: "王五", Email: "112.com", Age: 39})tx.Transaction(func(tx2 *gorm.DB) error {tx2.Create(&User{Name: "王六", Email: "112.com", Age: 39})return errors.New("rollback")})tx.Transaction(func(tx3 *gorm.DB) error {tx3.Create(&User{Name: "王七", Email: "112.com", Age: 39})return nil})return nil})
http://www.dtcms.com/a/336778.html

相关文章:

  • 机器学习的多种算法
  • 网络间的通用语言TCP/IP-网络中的通用规则2
  • 视觉语言导航(14)——VLN ON ROBOTIC 4.4
  • 力扣32:最长有效括号
  • 飞算JavaAI家庭记账系统:从收支记录到财务分析的全流程管理方案
  • 可编辑150页PPT | 某制造集团产业数字化转型规划方案
  • RH134 管理网络安全知识点
  • 多台服务器批量发布arcgisserver服务并缓存切片
  • JVM 内存管理与垃圾回收机制
  • SQL语法大全指南
  • Unity引擎播放HLS自适应码率流媒体视频
  • 实战测试:多模态AI在文档解析、图表分析中的准确率对比
  • 特征工程学习笔记
  • HTML应用指南:利用POST请求获取上海黄金交易所金价数据
  • PYTHON让繁琐的工作自动化-猜数字游戏
  • 万字长文深度解析HTTPS协议
  • 新手向:Java方向讲解
  • 问答社区运营优化:cpolar 提升 Answer 平台远程访问速度方案
  • 【前端面试题】JavaScript 核心知识点解析(第三十一题到第六十一题)
  • 智能汽车领域研发,复用云原生开发范式?
  • 迅速掌握Git通用指令
  • linux 常用代码
  • [优选算法专题二滑动窗口——将x减到0的最小操作数]
  • error #include<cuda_runtime_api.h>解决方案
  • w嵌入式分享合集68
  • 《动手学深度学习v2》学习笔记 | 1. 引言
  • 【每日一题】Day 6
  • 《算法导论》第 26 章 - 最大流
  • 华为云之Linux系统安装部署Tomcat服务器
  • 【C#补全计划】协变逆变