各位 gopher 大佬,sqlx 的事务对象 TX 和非事务对象 DB 没有啥联系,涉及事务的操作都要把那一套 defer 写一遍很烦,有没有类似 Spring 的 AOP 实现一劳永逸哇?
目前看了 monkey 框架,但是直接改写原方法内容,没法动态代理。
又看了 sandwich 框架,基于代码生成,也不是很优雅。
求一个优雅的解决方案哇。
PS:没用 gorm 是因为写 Java 的时候就对 Hibernate 深恶痛绝
PSS:选 sqlx 是因为写 SQL 比较自由,自己照着 mybatis 封装了一下,动态 SQL 现在能支持个大概。
|  |      1flyqie      2023-08-10 11:33:58 +08:00 via Android 代码生成已经很优雅了,也比较方便调试。 | 
|      2maotao456      2023-08-10 11:52:09 +08:00 | 
|      3maotao456      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 }) } | 
|      4bli22ard      2023-08-10 14:00:29 +08:00 db.Tx(func(tx *db.Tx){ //巴拉巴拉操作数据库 }) | 
|      5luvfinn      2023-08-10 19:07:10 +08:00 bun 你值得拥有 |