返回顶部
首页 > 资讯 > 后端开发 > GO >golang db事务的统一封装的实现
  • 400
分享到

golang db事务的统一封装的实现

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

目录简单封装偷懒第一步偷懒第二步偷懒第三步进一步封装事务处理的流程示例 database := db.DB tx, err := database.Begin(

事务处理的流程示例


    database := db.DB
    tx, err := database.Begin()
    if err != nil {
        return err
    }
    stmt, err := tx.Prepare(sqlQuery)
    if err != nil {
        tx.Rollback()
        return err
    }
    _, err = stmt.Exec(paras...)
    if err != nil {
        tx.Rollback()
        return err
    }
    err = tx.Commit()
    if err != nil {
        tx.Rollback()
        return err
    }

以上是我们使用事务时的一般操作,如果每做一次事务的操作均要进行重新写一遍代码岂不是很麻烦,尤其是出错时,Rollback需要多次在不同错误的地方的进行调用处理。

简单封装

偷懒第一步

采用defer处理Rollback


defer tx.Rollback()

无论成功与否,均进行Rollback操作,只是有点影响,如果成功还调用Rollback的话,将会报错。虽然可以忽略,但作为程序员,有必要进一步调整。

偷懒第二步

根据执行结果来选择执行Rollback,避免无效使用。


defer func() { //根据执行结果选择执行Rollback
        if err != nil && tx != nil {
        log.Println("ExecSqlWithTransaction defer err :", err)
            tx.Rollback()
        }
    }()

如此,我们就可以根据事务的执行结果决定是否Rollback了。

偷懒第三步

封装,以上代码本身就具有极大的普适性,因此,我们抽出通用的参数,将此过程封装成一个func,以后就可以直接调用了。


func ExecSqlWithTransaction(database *sql.DB, query string, args ...interface{}) (err error) {
    tx, err := database.Begin()
    if err != nil {
        return err
    }
    defer func() {
        if err != nil && tx != nil {
            tx.Rollback()
        }
    }()
    stmt, err := tx.Prepare(query)
    if err != nil {
        return err
    }
    defer stmt.Close()
    _, err = stmt.Exec(args...)
    if err != nil {
        return err
    }
    return tx.Commit()
}

封装后我们可以如下使用:


if err := ExecSqlWithTransaction(database,sqlQuery,paras...);err != nil{
    //错误处理
}

封装后是不是很简洁啊?

进一步封装

在一个事务中可能会出现多个SELECT、UPDATE等操作,以上封装仅处理了一种操作,还不能满足我们的实际需求,因此需要更进一步封装。


func ExecSqlWithTransaction(db *sql.DB, handle func(tx *sql.Tx) error) (err error) {
 tx, err := db.Begin()
 if err != nil {
  return err
 }
 defer func() {
  if err != nil {
   tx.Rollback()
  }
 }()
 if err = handle(tx); err != nil {
  return err
 }
 return tx.Commit()
}

在handle func内可以直接使用事务tx进行增删改查。

到此这篇关于golang db事务的统一封装的实现的文章就介绍到这了,更多相关Golang db事务封装内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: golang db事务的统一封装的实现

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

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

猜你喜欢
  • golang db事务的统一封装的实现
    目录简单封装偷懒第一步偷懒第二步偷懒第三步进一步封装事务处理的流程示例 database := db.DB tx, err := database.Begin(...
    99+
    2024-04-02
  • golang中如何实现db事务的统一封装
    小编给大家分享一下golang中如何实现db事务的统一封装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!事务处理的流程示例database :=&nbs...
    99+
    2023-06-22
  • golang中封装模型的常用函数如何实现?
    在Golang中,封装模型的常用函数可以通过使用结构体和方法来实现。结构体是一种自定义的数据类型,可以用来封装相关的数据和方法。方法是与结构体关联的函数,可以在方法内部访问和操作结构体...
    99+
    2024-02-12
  • Android从实现到封装一个MVP的示例
    这篇文章主要介绍了Android从实现到封装一个MVP的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方...
    99+
    2023-05-30
    android mvp
  • 详细聊一聊java中封装的那点事
    目录什么是封装封装拓展之包包的概念 什么是包访问权限什么是静态成员总结一下: 什么是封装 什么是封装呢?我们先来看一段代码 class Student { ...
    99+
    2024-04-02
  • SpringBoot实现统一封装返回前端结果集的示例代码
    在实际项目开发过程中、事实上我们经常用@restcontroller注释的方式,将相当于将返回数据的基本形式统一为JSON格式的数据。但是,由于我们的项目可能是由很多人开发的,所以我...
    99+
    2024-04-02
  • golang函数在面向对象编程中的封装实现
    go 语言中通过函数实现面向对象封装。首先创建自定义类型定义对象,然后使用带有指针参数的函数封装方法。通过指针参数访问并修改对象状态,提高代码可重用性和可维护性。 Go 语言函数在面向...
    99+
    2024-05-02
    面向对象编程 封装 golang
  • Golang与FFmpeg: 实现实时视频流转码与封装的技术
    Golang与FFmpeg结合可以实现实时视频流转码与封装的技术。下面是一个简单的示例代码,展示了如何使用Golang调用FFmpe...
    99+
    2023-10-08
    Golang
  • SpringBoot如何实现统一封装返回前端结果集
    这篇文章主要介绍了SpringBoot如何实现统一封装返回前端结果集的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot如何实现统一封装返回前端结果集文章都会有所收获,下面我们一起来看看吧。我们如...
    99+
    2023-07-02
  • SpringBoot封装JDBC的实现步骤
    Spring Boot中可以在配置文件中直接进行数据库配置, spring.datasource.username= root spring.datasource.passw...
    99+
    2024-04-02
  • JavaScript封装axios的实现详解
    目录摘要1.post方法2.create方法3.拦截器4.代码摘要 在vue中,我们调用接口使用的都是axios,使用之前我们也会进行一定的封装,然后再进行使用。 在这里,我们主要说...
    99+
    2024-04-02
  • vue3.0实现下拉菜单的封装
    vue3.0出来已经有段时间的了,也与必要开始研究它了! 先看下我们要实现的效果 很常见的展开显示菜单项的内容,在vue3.0里面怎么开发,这里样式我们用的是bootstrap的默...
    99+
    2024-04-02
  • 原生AJAX封装的实现方法
    这篇文章主要介绍“原生AJAX封装的实现方法”,在日常操作中,相信很多人在原生AJAX封装的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”原生AJAX封装的实现方法”...
    99+
    2024-04-02
  • Python对FTP交互封装的实现
    目录使用工具:ftp登录脚本pexpect组件简介1. spawn类2. run函数使用工具: pexpect库 pexpect可以理解为Linux下expect(不知道的可以百度下...
    99+
    2024-04-02
  • springboot断言异常封装与统一异常处理实现代码
    目录步骤1、异常类2、统一异常处理配置类3、断言类4、使用补充:异常处理器说明handleServletExceptionhandleBindExceptionhandleValid...
    99+
    2023-01-11
    springboot断言异常封装 springboot统一异常 springboot异常处理
  • Flutter实现矩形取色器的封装
    前言 最近看插件库上少有的取色器大都是圆形的或者奇奇怪的的亚子,所以今天做两个矩形的颜色取色器 提示:以下是本篇文章正文内容,下面案例可供参考 一、BarTypeColorPicke...
    99+
    2024-04-02
  • vue3.0实现复选框组件的封装
    本文实例为大家分享了vue3.0实现复选框组件封装的具体代码,供大家参考,具体内容如下 大致步骤: 实现组件本身的选中与不选中效果 实现组件的v-model指令 ...
    99+
    2024-04-02
  • JavaScript实现table切换的插件封装
    本文实例为大家分享了JavaScript实现table切换插件的封装代码,供大家参考,具体内容如下 效果图: HTML部分: <div class="box"> ...
    99+
    2024-04-02
  • vue虚拟化列表封装的实现
    目录vue虚拟化列表封装将下面代码复制一份到自己的项目中 vue虚拟列表-vue-virtual-scroll-list使用场景安装使用vue虚拟化列表封装 将下面代码复制...
    99+
    2024-04-02
  • Vue实现轮播图组件的封装
    目录轮播图功能-获取数据轮播图-通用轮播图组件轮播图-数据渲染轮播图-逻辑封装轮播图功能-获取数据 目标: 基于pinia获取轮播图数据 核心代码: (1)在types/data.d...
    99+
    2023-05-16
    Vue轮播图组件封装 Vue组件封装
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作