golang sqlx 的事务封装

274 天前
 thisisgpy

各位 gopher 大佬,sqlx 的事务对象 TX 和非事务对象 DB 没有啥联系,涉及事务的操作都要把那一套 defer 写一遍很烦,有没有类似 Spring 的 AOP 实现一劳永逸哇?

目前看了 monkey 框架,但是直接改写原方法内容,没法动态代理。

又看了 sandwich 框架,基于代码生成,也不是很优雅。

求一个优雅的解决方案哇。

PS:没用 gorm 是因为写 Java 的时候就对 Hibernate 深恶痛绝

PSS:选 sqlx 是因为写 SQL 比较自由,自己照着 mybatis 封装了一下,动态 SQL 现在能支持个大概。

977 次点击
所在节点    程序员
5 条回复
flyqie
274 天前
代码生成已经很优雅了,也比较方便调试。
maotao456
274 天前
maotao456
274 天前
@maotao456 再附一段使用代码给你


// executeUserRegistrationTransaction 执行用户注册的事务
func (a *LoginService) executeUserRegistrationTransaction(ctx context.Context, wxPlainData *keyWechatUserInfo, wechatAppName string) error {

// 生成新用户的 memberCode
memberCode := wxPlainData.PhoneNumber

// 生成新用户需要的几个关联数据
wxUser, wxUserLink, memberEntity := a.prepareNewUserRelatedEntities(
memberCode,
wxPlainData,
wechat.GetAppIDByInstanceName(wechatAppName),
)

return transaction.Run(ctx, func(tx database.DB) error {
var err error
// 插入新用户
if _, err = exec.CreateForNamed(ctx, memberEntity, tx); err != nil {
return fmt.Errorf("create member failed. reason: %w", err)
}

// 插入新用户的微信信息
if _, err = exec.CreateForNamed(ctx, wxUser, tx); err != nil {
return fmt.Errorf("create wx user failed. reason: %w", err)
}

// 插入新用户的微信关联信息
if _, err = exec.CreateForNamed(ctx, wxUserLink, tx); err != nil {
return fmt.Errorf("create wx user link failed. reason: %w", err)
}
return nil
})
}
bli22ard
274 天前
db.Tx(func(tx *db.Tx){

//巴拉巴拉操作数据库
})
luvfinn
273 天前
bun 你值得拥有

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

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

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

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

© 2021 V2EX