iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >详解如何利用GORM实现MySQL事务
  • 724
分享到

详解如何利用GORM实现MySQL事务

2024-04-02 19:04:59 724人浏览 独家记忆
摘要

目录前言禁用默认事务自动事务手动事务嵌套事务SavePoint、RollbackTo小结前言 为了确保数据一致性,在项目中会经常用到事务处理,回滚操作还是比较常见的需求;事务处理可以用来维护数据库的完整性,保证成批的sq

前言

为了确保数据一致性,在项目中会经常用到事务处理,回滚操作还是比较常见的需求;事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部都执行,要么全不执行,对于Mysql事务相信大家应该都不陌生,这篇文章主要总结一下在Go语言中GORM是如何实现事务的;感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

禁用默认事务

gorm事务默认是开启的。为了确保数据一致性,Gorm会在事务里执行写入操作(增删改)。

如果对数据一致性要求不高的话,可以在初始化时禁用它,性能将提升大约30%。

一般不推荐禁用。

// 全局禁用
db, err := gorm.Open(SQLite.Open("gorm.db"), &gorm.Config{
  SkipDefaultTransaction: true,
})

自动事务

通过db.Transaction函数实现事务,如果闭包函数返回错误,则回滚事务。

db.Transaction(func(tx *gorm.DB) error {
  // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  if err := tx.Create(&User{Name: "Lili"}).Error; err != nil {
    // 返回任何错误都会回滚事务
    return err
  }

  if err := tx.Create(&User{Name: "xiaoming"}).Error; err != nil {
    return err
  }

  // 返回 nil 提交事务
  return nil
})

手动事务

开发中经常需要数据库事务来保证多个数据库写操作的原子性。例如电商系统中的扣减库存和保存订单。

gorm事务用法:

// 开启事务
tx := db.Begin()

//在事务中执行数据库操作,使用的是tx变量,不是db。

//库存减一
//等价于: UPDATE `goods` SET `stock` = stock - 1  WHERE `goods`.`id` = '2' and stock > 0
//RowsAffected用于返回sql执行后影响的行数
rowsAffected := tx.Model(&goods).Where("stock > 0").Update("stock", gorm.Expr("stock - 1")).RowsAffected
if rowsAffected == 0 {
    //如果更新库存操作,返回影响行数为0,说明没有库存了,结束下单流程
    //这里回滚作用不大,因为前面没成功执行什么数据库更新操作,也没什么数据需要回滚。
    //这里就是举个例子,事务中可以执行多个sql语句,错误了可以回滚事务
    tx.Rollback()
    return
}
err := tx.Create(保存订单).Error

//保存订单失败,则回滚事务
if err != nil {
    tx.Rollback()
} else {
    tx.Commit()
}

嵌套事务

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

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

这里rollback到了sp1的位置,也就是说,数据库中只存了user1这条数据。

小结

关于Go GORM 事务详细介绍的文章就介绍到这了,总的来说Gorm事务的实现非常简单,go语言操作mysql事务主要用到了三个函数:

  • Db.Begin() 开始事务
  • Db.Commit() 提交事务
  • Db.Rollback() 回滚事务

到此这篇关于详解如何利用GORM实现MySQL事务的文章就介绍到这了,更多相关golang GORM实现MySQL事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: 详解如何利用GORM实现MySQL事务

本文链接: https://www.lsjlt.com/news/33993.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何利用MQ实现事务补偿
    本篇内容介绍了“如何利用MQ实现事务补偿”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!rabbitMQ 在...
    99+
    2024-04-02
  • 详解如何利用PHP实现RPC
    目录1.什么是RPC2.从通信协议的层面3.从不同的开发语言和平台层面4.从调用过程来看5.常见的几种通信方式6.php实现简单的rpc1.目录结构2.rpc服务端3.rpc 客户端...
    99+
    2024-04-02
  • MySql事务及ACID实现原理详解
    目录逻辑架构和存储引擎自动提交特殊操作ACID 特性原子性持久性隔离性脏读、不可重复读和幻读事务隔离级别MVCC一致性逻辑架构和存储引擎 自动提交 MySQL 中默认采用的是自动提...
    99+
    2024-04-02
  • 如何利用C++实现mysql数据库的连接池详解
    目录为什么是mysql? 为什么要搞资源池? mysql资源池实现的案例源码 头文件:MysqlPool.h实现文件:MysqlPool.cpp测试函数总结为什么是mysql? 现...
    99+
    2024-04-02
  • mysql定时任务(event事件)实现详解
    1.事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。 事件和触发器类似,都是在某些事...
    99+
    2024-04-02
  • 我们如何实现MySQL事务?
    我们知道,在事务中,语句是作为一个单元执行的。如果事务内的任何操作失败,则整个事务将失败并应回滚;否则,语句所做的任何更改都会保存到数据库中。为了实现事务,MySQL 提供了以下语句 -START TRANSACTION顾名思义,事务从此语...
    99+
    2023-10-22
  • 如何利用Redis实现分布式事务管理
    如何利用Redis实现分布式事务管理引言:随着互联网的快速发展,分布式系统的使用越来越广泛。在分布式系统中,事务管理是一项重要的挑战。传统的事务管理方式在分布式系统中难以实现,并且效率低下。而利用Redis的特性,我们可以轻松地实现分布式事...
    99+
    2023-11-07
    管理 redis 分布式事务
  • 【Mysql】mysql事务处理用法与实例详解
    来源:转载  代码如下 复制代码 root@host# mysql -u root -p pas...
    99+
    2024-04-02
  • MySQL如何实现RC事务隔离
    这篇文章给大家分享的是有关MySQL如何实现RC事务隔离的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ReadView机制基于undo log版本链条实现的一套读视图机制,事务生成一个ReadView:若为事务自...
    99+
    2023-06-29
  • MySQL事务详解:何时应该考虑使用事务?
    MySQL事务详解:何时应该考虑使用事务? 在数据库操作中,事务是一组被视为一个单独单元的操作,要么全部成功,要么全部失败。MySQL支持事务,通过使用事务可以确保数据库操作的一致性和...
    99+
    2024-03-01
    mysql 使用 事务
  • 如何在Mysql中实现事务ACID
    这期内容当中小编将会给大家带来有关如何在Mysql中实现事务ACID,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原子性根据定义,原子性是指一个事务是一个不可分割的工作单...
    99+
    2024-04-02
  • 详解如何利用Redis实现生成唯一ID
    目录一、摘要二、方案实践2.1、引入 Redis 组件2.2、添加 redis 环境配置2.3、编写服务验证逻辑,通过 aop 代理方式实现2.4、在相关的业务接口上,增加SubmitLimit注解即可三、小结一、摘要 ...
    99+
    2022-11-19
    Redis生成唯一ID Redis 唯一ID
  • 详解如何利用Python实现报表自动化
    目录Excel的基本组成一份自动化报表的流程报表自动化实战当日各项指标的同环比情况当日各省份创建订单量情况最近一段时间创建订单量趋势将不同的结果进行合并本篇文章将带你了解报表自动化的...
    99+
    2023-05-14
    Python实现报表自动化 Python报表自动化 Python自动化
  • 详解如何利用C++实现一个反射类
    目录正题开始Singleton.h反射类Reflex.h代码环境为VScode + CMake + GCC 8.1.0 首先,如何才能做到给我一个名字我就能拿到这个对象的这个值,也是...
    99+
    2023-03-09
    C++实现反射类 C++反射类
  • Java与Oracle实现事务(JDBC事务)实例详解
    Java与Oracle实现事务(JDBC事务)实例详解J2EE支持JDBC事务、JTA事务和容器事务事务,这里说一下怎样实现JDBC事务。       JDBC事务是由Connec...
    99+
    2023-05-31
    java jdbc事务 ava
  • 如何利用vue3实现放大镜效果实例详解
    目录前言一、封装的意义二、如何封装? 1.  准备 2.  开始封装 3. 使用 三、 效果演示 总结前言 逛购物网站的时候,想必大家都见过鼠标放到商品上,会有一...
    99+
    2024-04-02
  • mysql实现事务的提交与回滚的实例详解
    最近要对数据库的数据进行一个定时迁移,为了防止在执行过程sql语句因为某些原因报错而导致数据转移混乱,因此要对我们的脚本加以事务进行控制。 首先我们建一张tran_test表 CREATE TABLE ...
    99+
    2024-04-02
  • 如何实现MySQL中的事务处理?
    如何实现MySQL中的事务处理?事务是数据库中重要的概念之一,能够保证数据的一致性和完整性,确保在并发操作中数据的正确性。MySQL作为一种常用的关系型数据库,也提供了事务处理的机制。一、事务的特点事务具有以下四个特点,通常用ACID来概括...
    99+
    2023-10-22
    MySQL 事务 处理
  • 详解如何利用C#实现设置系统时间
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-20
    C#设置系统时间 C#设置时间 C# 系统时间
  • 如何利用node实现静态文件缓存详解
    目录缓存缓存位置分类缓存设置headernode实现静态文件缓存强缓存思路代码实现效果展示协商缓存思路代码实现效果展示总结缓存 浏览器缓存(Brower Caching)是浏览器对...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作