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