- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Go工程化如何在整洁架构中使用事务?由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
回顾先简单回顾一下 《Go工程化(九) 项目重构实践》 如果还没看过之前这篇文章可以先看一下:
在我们之前的项目目录分层中,我们主要分为了五个块:
在之前的文章中仅仅提到了一个非常简单的示例,但是我们实际业务流程往往没有那么简单,就一个非常常见的例子,我们现在需要创建一篇文章,文章上需要关联分类或者是标签信息,这里至少就分两步:
这两个创建操作需要保证一致性,我们需要在数据库中使用事务,这时候我们的事务在哪里承载呢?
其中最简单也最直接的办法就是在 repo 的 CreateArticle 方法中我们就使用事务去同时创建文章以及标签之间的关联关系.
针对第一个问题,最简单的办法就是我们提供一个 CreateArticleWithTags 方法表示同时创建这两者,如果我们需要一个独立的 CreateArticle 再写一个就好了.
但是随着需求越来越多,可能后面还有需要和角色关联的,和商品关联的等等.
难道我们就一种逻辑写一个方法么。想想就可怕.
还是在参数中加上很多可选的 options,然后在一个方法中不断判断。那我们还拿 usecase 做什么直接写一起不更好么?
ok,所以直接在 repo 层里面来实现看上去好像行不通,那我们就把视线往上移动,我们在 usecase 来解决这个问题.
事务的能力是在 repo 上提供的,所以我们需要在 repo 层提供一个事务接口,然后在 usecase 中进行调用,保证是事务执行的就行.
在 repo 中,我们可以像上面这样定义,提供一个 Tx 方法,这个方法接受一个 ArticleRepoTxFunc 作为参数,这个函数中的 repo 是开启了事务的 repo,通过这个 repo 调用的所有方法都是在事务中执行的.
然后我们在 usecase 调用的时候就可以这样.
这样写起来就整洁很多了,业务逻辑和我们最初的设计一样,在 usecase 中实现了,repo 中我们也保持了简单的原则.
这样是不是就万事大吉了呢?如果万事大吉了这篇文章到这儿也就应该结束了,但是还没有,说明我在实践的过程中还碰到了问题.
问题很简单,就是我们在 usecase 中不仅仅需要复用 repo 中的代码,还有可能需要复用 usecase 中的代码,不然我们就可能在 usecase 中出现很多相同的逻辑代码片段,代码的重复率就很高.
我们来看下面一个例子会不会发现有点什么不对.
这个方法内其实是开启了两个事务,这两个事务之间互不相关,不符合我们需求.
我们在 usecase 中也创建了一个 tx 方法,和 repo 类似,在调用 tx 之后,handler 中的方法的需要都是用新的参数 usecase 这个新的 usecase 可以保证里面的 repo 调用都是事务的.
所以我们之前的 A 函数可以修改为这样:
这样就没有问题了么?我们 UpdateXXX 方法中也调用 u.tx 方法,这样就会导致反复开启事务,虽然在 gorm 的 Transaction 方法是支持嵌套事务的,但是我们还是不要滥用这个特性.
解决办法很简单,我们只需要在执行的时候判断下就行了.
然后我们在 tx 方法内:
文章到这里就到尾声了,同样的问题,我们现在这么写就可以了么?
对于我当前所遇到的一些需求来说已经可以解决了,当然这个方案并不完美,比如说我们涉及到多个 repo 的时候,当前的方法就没法直接用了,还得进行一些改造,虽然我们要有远见但是也不要想的太多,进化是优于完美的.
原文链接:https://mp.weixin.qq.com/s/MSwUlVGPDRBjdR-xh5cNfA 。
最后此篇关于Go工程化如何在整洁架构中使用事务?的文章就讲到这里了,如果你想了解更多关于Go工程化如何在整洁架构中使用事务?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用这种代码: document.write("foo 使用 HTML tidy 后,表格外的 script 标签被移除,因此破坏了页面布局。我
我正在为我的网格系统使用 Bourbon 的 Neat 库。 我有这样的代码: section { @include outer-container; aside { @include spa
我有三个文件。 header.php index.php footer.php 头文件包含来自至 索引文件包含页面内容页脚文件包含 至 它们一起包含一个带有 PHP 的普通 HTML 文件 当我使用
我有一个格式有点乱的 Objective-C 代码库。有没有办法让 Xcode 重新格式化整个项目以符合编码标准(即正确缩进、空格与制表符等)?是否有其他工具可以完成此任务? 最佳答案 去壳化:htt
我试图自己实现整洁,使用原始论文但被卡住了。 假设在上一代我有以下物种: Specie 1: members: 100 avg_score: 100 Specie 2: memb
我正在尝试整理我的一些 SKScene 代码。目前我有大约 11 个对 SKNode 的引用(有些是包含子节点的层)。这些节点及其子节点被类频繁访问。我考虑这样做的方式是: 将所有 SKNode 子类
Notepad++ 的 HTML Tidy 坏了吗?除了 Tidy(第一个)之外,所有命令都不起作用。他们不显示任何消息,即使选择了所有文本。我真的需要 Tidy 才能工作,还是它只是最新版本 N++
有没有一种方法可以不使用 rowwise() 来创建 key? 非常感谢任何指针。 df % rowwise %>% mutate(key=paste(sort(c(grp1, grp2)), col
我正在尝试使用作为 PHP (http://www.php.net/manual/en/book.tidy.php) 一部分的 HTML Tidy 实现来重新格式化大量 HTML。我遇到了一个问题,其
我为 Sublime Text 2 安装了 phptidy 插件,并尝试用它来清理一些丑陋的代码,比如 $tdt="
我在 Windows 的命令行环境中使用 HTML Tidy。我需要强制将一些 html 文件转换为 xml,即使有错误也是如此。 我执行以下步骤: 创建文件“conf.txt”,其内容为: 强制输出
我正在重写一个使用 Bourbon 的“旧”React 原型(prototype),它还在 gulpfile 中使用 gulp-sass 来注入(inject)节点整洁的依赖项: var sassOp
我正在创建一个供个人使用的 jQuery Accordion 插件。 我的主要目标是拥有 super 简洁的 JS 代码和 HTML 结构。 这就是我已经走了多远 http://jsfiddle.ne
我正在测试 Bourbon Neat,我在一个外容器中有两列,我希望这些列的高度相等(与最高的列一样高)。在短列上使用 @include fill-parent 不起作用,它只会使它与外部容器一样宽。
大多数时候在 repos 中,我们看到一个 PR,然后是那个 PR 的 merge 提交,它只是说“Merged pull request #XXX from ...”。 但最近,我看到了一个紧凑的版
我正在使用 Neat 的 12 列网格。该页面由延伸整个网格宽度的部分组成。部分背景与页面背景不同: 如您所见,粉红色部分的左侧与网格边缘齐平。我想要的是该部分的左侧超出网格几个雷姆。 但是,如果我添
只是出于好奇而提出的简单问题。 类上的多个方法需要使用字符串流,或者特别是 ostringstream。 1) 有一个 stringstream 变量作为类成员,然后在使用它之前清除它,即 msg.s
我是波旁/整洁的新手。我有一个关于嵌套的问题:我希望红色框填充整个宽度,而彼此之间不要有排水沟。当在其上使用“@include omega”时,第一个框将删除其右边距,但是右边的框仍具有边距,并且不会
GWT(Google Web Toolkit)是否有一个功能可以漂亮地打印小部件的 html 输出? (如果问题措辞不当,我深表歉意——我不是 GWT 开发人员,但我们的开发人员声称没有办法做到这一点
我是一名优秀的程序员,十分优秀!