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

golang sqlx 的事务封装

  •  
  •   thisisgpy · 2023-08-10 11:32:27 +08:00 · 1269 次点击
    这是一个创建于 476 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位 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  
       2023-08-10 11:33:58 +08:00 via Android
    代码生成已经很优雅了,也比较方便调试。
    maotao456
        2
    maotao456  
       2023-08-10 11:52:09 +08:00
    maotao456
        3
    maotao456  
       2023-08-10 11:57:34 +08:00
    @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  
       2023-08-10 14:00:29 +08:00
    db.Tx(func(tx *db.Tx){

    //巴拉巴拉操作数据库
    })
    luvfinn
        5
    luvfinn  
       2023-08-10 19:07:10 +08:00
    bun 你值得拥有
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2764 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:40 · PVG 23:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.