我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在不同的 DAO 中使用相同的 DB 事务

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在不同的 DAO 中使用相同的 DB 事务

本篇文章给大家分享《在不同的 DAO 中使用相同的 DB 事务》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我的一个 golang 应用程序中有一个用例,用于更新 api 中的多个表,如果其中一个更新失败,我希望回滚所有以前的更新(java 中的 @transactional 就是这样做的)。 我尝试按以下方式进行操作:

func (d *dao) method1(opt string) error {
    tx, err := d.db.begintx(context.background(), nil)
    if err != nil {
        return errors.errorf("unable to start transaction")
    }
    err := d.dao1.update1(opt)
        if err != nil {
            log.infof("error : %s. rolling back transaction", err)
            _ = tx.rollback()
            log.infof("transaction rolled back while update 1")
            return err
        }
        err = d.dao2.update2(opt)
        if err != nil {
            log.errorf("error in making update 2 "+
                "error %v ", err)
            _ = tx.rollback()
            log.infof("transaction rolled back while update 2")
            return err
        }
    }
}


func(d *dao1) update1 error {
        var query = "update t1 set c1 = ? where id = ?"
        _, err := d.db.exec(query, "v1", "v2")
        return err
}

func(d *dao2) update2 error {
        var query = "update t2 set c2 = ? where id = ?"
        _, err := d.db.exec(query, "v1", "v2")
        return err
}

但这不起作用,因为我们正在 update1 和 update2 方法中创建新事务。 所以我尝试在方法 update1 和 update2 的方法参数中传递事务,如下所示:

func Update1(tx sql.Tx) error {
    var query = "update T1 set C1 = ? where id = ?"
    _, err := tx.Exec(query, "v1", "v2")
    return err
}

但问题是在某些用例中我只想调用方法 update1 。那么,在 update1 方法中传递的交易值应该是多少?

或者有更好的方法吗?有人可以帮忙吗?


正确答案


如果我理解正确,在某些情况下,您希望调用 update1 但不调用 update2,而在其他情况下,您希望两个更新都发生。如果是这样的话,那么我建议这更多是一个设计问题,而不是 tx 的使用问题。我认为设计两个函数,每个函数都描述您期望的行为,并将调用哪个函数的逻辑委托给调用者,可能会起作用。类似于:

func Caller() error {
    if condition {
        return UpdateOne()
    }
    return UpdateBoth()
}

func UpdateOne() error { … }
func UpdateBoth() error { … }

到这里,我们也就讲完了《在不同的 DAO 中使用相同的 DB 事务》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注编程网公众号,带你了解更多关于的知识点!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在不同的 DAO 中使用相同的 DB 事务

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

下载Word文档

猜你喜欢

在不同的 DAO 中使用相同的 DB 事务

本篇文章给大家分享《在不同的 DAO 中使用相同的 DB 事务》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的
在不同的 DAO 中使用相同的 DB 事务
2024-04-04

怎么在Linux中切换相同程序的不同版本

这篇文章主要为大家展示了“怎么在Linux中切换相同程序的不同版本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么在Linux中切换相同程序的不同版本”这篇文章吧。使用 update-alte
2023-06-16

在不同的 go 版本中使用 ginkgo

php小编百草为您介绍如何在不同的Go版本中使用Ginkgo。Ginkgo是一个强大的Go语言测试框架,它提供了丰富的特性和灵活的语法,使得编写和运行测试变得更加简单高效。然而,在不同的Go版本中,由于语法和API的变化,可能会导致使用Gi
在不同的 go 版本中使用 ginkgo
2024-02-09

SQL SERVER 下,批量在不同的数据库中执行相同的脚本

转自:https://blog.51cto.com/liuxinya/354983 作为DBA我们经常需要对不同的数据库执行相同的查询,如果你的服务器上只有2个数据库当然可以手工依次执行,但如果一个数据库服务器上有几百个库呢,你是否觉得会崩溃呢。 解决方法:

	SQL SERVER 下,批量在不同的数据库中执行相同的脚本
2018-06-20

为什么使用相同的种子会得到不同的随机数?

问题内容我正在使用具有以下 mwe 的 numpy 随机数生成器:import numpy as npnp.random.seed(40)print(np.random.randint(-3, 4))rng = np.random
为什么使用相同的种子会得到不同的随机数?
2024-02-22

在 PHP 中,不同类型的函数如何相互作用?

在 php 中,函数之间可以通过参数传递和返回值交互:参数传递:函数通过参数接收其他函数或外部源的数据。返回值:函数通过返回值向调用函数返回数据或状态信息。这使得我们可以创建模块化、可重用和易于维护的代码。实战案例中,我们使用常规函数调用静
在 PHP 中,不同类型的函数如何相互作用?
2024-04-18

利用Java怎么获取集合中相同与不同的元素

利用Java怎么获取集合中相同与不同的元素?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。语法 removeAll(Collection c)c:包含从列表中移除元素的co
2023-05-30

不允许在函数参数中使用相同底层基本类型的类型

哈喽!今天心血来潮给大家带来了《不允许在函数参数中使用相同底层基本类型的类型》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!问题内容我
不允许在函数参数中使用相同底层基本类型的类型
2024-04-05

Discuz! 中实现不同版块使用不同的模板文件的方法

通过此修改可在Discuz!X1后台为不同版块设置不同的模板文件。在需要为论坛不同版块设置不同模板风格的时候特别有用,比如你专门一个版块用来发布活动,那么可以为这个版块专门做一个模板文件,从而实现个性化的要求: 安装步骤 第一步:升级数据库
2022-06-12

如何用 Golang 在不同时区的协程中同步时间?

在 go 协程中同步不同时区的方法:使用 time.loadlocation() 函数从时区数据库中加载时区信息,返回代表该时区的 *time.location 实例。在协程中使用上下文,将 *time.location 上下文传递给每个协
如何用 Golang 在不同时区的协程中同步时间?
2024-05-22

如何在ubuntu中切换使用不同版本的python

在ubuntu环境下进行嵌入式开发,我们在进行不同的项目开发时,可能会遇到python环境不统一的情况,下面这篇文章主要给大家介绍了关于如何在ubuntu中切换使用不同版本的python的相关资料,需要的朋友可以参考下
2023-02-22

怎么在ubuntu中切换使用不同版本的python

这篇文章主要介绍“怎么在ubuntu中切换使用不同版本的python”,在日常操作中,相信很多人在怎么在ubuntu中切换使用不同版本的python问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在ubun
2023-07-05

使用PHP怎么在两个文件中找出相同的记录

使用PHP怎么在两个文件中找出相同的记录?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。引言给定a,b两个文件, 分别有x,y行数据, 其中(x, y均大于10亿
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录