各位大佬在 go 中都是怎么使用事务?有没有更好的方式

2022-02-25 11:07:06 +08:00
 longmeier90

最近在写 go 项目中发现一个问题,我有一个对外提供的支付接口,接口中又去调了很多封装好的更改数据库的操作函数。然后我发现要是想对整个接口用一个事务的话,需要在接口最开始初始一个*db 连接,然后传给各个函数。这样才能实现一个事务接口。

tx, _ := dao.MysqlDB.Begin()  // 初始化 db 连接
defer tx.Rollback()
logic.UpdateProjectDiscountMemo(*tx,proDisMemoList)  // 更新项目折扣
logicCreateUserEventsRecord(*tx,groupId)       // 更新用户记录
tx.Commit()
7116 次点击
所在节点    Go 编程语言
41 条回复
9c04C5dO01Sw5DNL
2022-02-25 18:34:10 +08:00
@Hanggi 你看,我还没说 if err 的问题你自己就先忙着解释了。。。。我这说的是手动控制事务的事呢
joesonw
2022-02-25 18:46:31 +08:00
都是自己套的. Database 封装一层,

一般是
func BeginReadWrite(ctx context.Context, f func(ctx context.Context) error) error
去调用 f 的时候, ctx 里会带上 transaction 对象, 然后在这里处理错误, 和 defer 里面抓错误, 来 commit 或 rollback

然后 Repository 层被调用的时候, 从 context 里取出来.

transaction 一般最好是 interface, 这样方便有时候不需要事务, 传入裸的连接直接用, 也不用改里面的代码.
Hanggi
2022-02-25 18:54:53 +08:00
@giiiiiithub 又来一个小丑。国内现状的代表
9c04C5dO01Sw5DNL
2022-02-25 18:56:59 +08:00
@Hanggi 这就飙脏字了?这素质能代表 go 开发者集体么?不能就咽回去(*^_^*)
FrankAdler
2022-02-25 19:18:42 +08:00
@Hanggi #14 gorm 那种写法,如果逻辑都在一起还好说,但是对应楼主说那种,调用链比较长,每个环节都可能有事务就麻烦了,需要共用一个初始的事务实例,类似 Context 那种一路传下去还挺难受的。
wunonglin
2022-02-25 20:39:44 +08:00
@nekoneko #7 mongo 官方的驱动比 mysql 的好用太多了。一个天一个地
Hanggi
2022-02-25 20:54:12 +08:00
@FrankAdler 首先事务的范围还是尽量控制在小范围,非要长调用链,可以试试上面 gorm 里的其他写法。
joesonw
2022-02-26 14:54:18 +08:00
gorm 怎么说呢,不一定全部盲目采信它的模式。它也是 v2 才支持传递 context 的,v1 的时候做链路追踪都只能挂到 Scope 上。
28Sv0ngQfIE7Yloe
2022-02-28 10:13:14 +08:00
@giiiiiithub #24

看到了吗,国内 go 圈子的现状,不接受质疑。质疑的话你就是「🤡」

关键大多数都是 crud boy ,对于我这种渣渣,go 确实生产力不够强大。
9c04C5dO01Sw5DNL
2022-02-28 11:17:59 +08:00
拿着步枪当宝贝。你看他那样,上来就先给自己裹小脚“控制范围”,这用得着他说嘛,没有就是没有,原始就是原始,麻烦就是麻烦,跟控制范围有鸡毛关系。还什么 if err 能产出较高质量代码,头一回见这么能扯的。

啥是宗教?这玩意就是典型的宗教信徒。
9c04C5dO01Sw5DNL
2022-02-28 11:18:58 +08:00
@Morii 忘了圈你,在楼上。
zzy11
2022-02-28 17:00:16 +08:00
dany813
2022-02-28 17:31:06 +08:00
大道至简 好牛逼
whyso
2022-03-01 10:14:23 +08:00
@Morii 所以为啥 java 转 go ,图个啥呢?
28Sv0ngQfIE7Yloe
2022-03-01 13:39:25 +08:00
@whyso #34

换组了,就换技术栈了
lessMonologue
2022-03-01 14:47:58 +08:00
@Morii 我也是从 Java 转到 go 的,我发现接手的项目竟然没有事务控制!每一步更新表都能从表里读出来。。。。
28Sv0ngQfIE7Yloe
2022-03-01 15:57:36 +08:00
@lessMonologue #36

这个就是设计的问题了,和语言无关哈哈,这里讨论的是 go 主流的 orm 事务太难用了哈哈
aurtech
2022-03-10 17:52:15 +08:00
在深圳,求一枚 Golang 大佬!!欢迎砸简历 V:Ifboredgunquxuexi.
xsen
2022-03-10 20:33:21 +08:00
确实是与语言无关,只是现成已有的 orm 没有封装好;当然,最大问题还是 go 相对来说比较新的语言,成熟的轮子少,而且主要场景是基础设施

毕竟传统的企业应用,Java 都有现成的;没必要为了用新 语言就全部重写
而且现在微服务(包括服务网格这类的),都支持 sidecar ;所以一个系统多语言架构也越来越多常见
aurtech
2022-03-11 15:23:11 +08:00
坐标深圳,求一枚 Golang 大佬!!欢迎砸简历 V:Ifboredgunquxuexi.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX