V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thisisgpy
V2EX  ›  程序员

golang sqlx 的事务封装

  •  
  •   thisisgpy · 261 天前 · 951 次点击
    这是一个创建于 261 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    5 条回复    2023-08-10 19:07:10 +08:00
    flyqie
        1
    flyqie  
       261 天前 via Android
    代码生成已经很优雅了,也比较方便调试。
    maotao456
        3
    maotao456  
       261 天前
    @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
        4
    bli22ard  
       261 天前
    db.Tx(func(tx *db.Tx){

    //巴拉巴拉操作数据库
    })
    luvfinn
        5
    luvfinn  
       261 天前
    bun 你值得拥有
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1283 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:41 · PVG 01:41 · LAX 10:41 · JFK 13:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.