V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xiaozirun
V2EX  ›  Go 编程语言

大佬们请教个问题,正在使用 gorm 有些必要弄个事务提交成功后回调的工具吗?

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

    为什么有这个疑问呢,因为这似乎是个少用的工具,gorm也不支持。都是又觉得有必要,在一些场景下可能会用到,例如在服务层的方法中向消息队列发布消息,这显然是要在事务成功提交后发布的。 实现大致方向是封装事务方法,在context中写一个值来存储回调方法。

    第 1 条附言  ·  95 天前
    可能确实是一个少用的工具,但是为什么想着要弄这个东西和框架有关系,事件驱动,消息都由服务层发出,*gorm.Db`都是通过`context 传入服务层,由服务层来决定是否开启事务,同时服务层对当前的*gorm.Db 是否开启事务并不清楚,当接口层涉及多个操作时,也会开启事务,这时服务层再开启事务就是子事务(这里 gorm 的事务方法通过 mysql 的 save point 实现了子事务),这时这个事务能不能最终提交由接口层决定,同时一些脚步在调用服务层方法时也会开启事务。
    8 条回复    2024-08-30 19:15:13 +08:00
    securityCoding
        1
    securityCoding  
       95 天前   ❤️ 1
    想复杂了吧哥,这两个异构中间件就正常业务流程写就好了吧, tx 提交后再调用 mq
    dobelee
        2
    dobelee  
       95 天前   ❤️ 2
    没必要这么花里胡哨,你这样也保证不了一致性。还不如保持存储层简单干净,消息逻辑里发就行。
    lasuar
        3
    lasuar  
       95 天前   ❤️ 1
    这不是一个少用的工具,而是一个性化的需求。
    xiaozirun
        4
    xiaozirun  
    OP
       94 天前
    @dobelee 消息大多在服务层发送,就是事务有些是接口层控制的
    xiaozirun
        5
    xiaozirun  
    OP
       94 天前
    主要是框架导致,使用了子事务,导致服务层的事务提交不一定是最终提交。
    xiaozirun
        6
    xiaozirun  
    OP
       94 天前
    @securityCoding 但是 gorm 的 Transaction 方法可以开启子事务,当前事务的提交不一定代表最终提交,所以想着需不需要这样的工具,或通过其他方式。
    Kauruus
        7
    Kauruus  
       92 天前   ❤️ 2
    用 outbox 模式,把消息也写到 db 。
    xiaozirun
        8
    xiaozirun  
    OP
       92 天前
    @Kauruus 非常感谢,拓宽了我的眼界,outbox 模式是我现在所知道的最佳解决方案。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2700 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:43 · PVG 15:43 · LAX 23:43 · JFK 02:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.