事务最怕散落在多个 repository 里。一个业务动作需要同时写订单、库存和流水时,事务边界应该放在用例层,由它决定所有写操作是否一起提交。

err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
    if err := orderRepo.Create(ctx, tx, order); err != nil {
        return err
    }
    return stockRepo.Decrease(ctx, tx, skuID, count)
})

repository 可以接受 tx 或抽象后的 executor,但不应该自己偷偷开事务。否则上层无法保证一组写操作的一致性。

事务内不要做慢调用,比如 HTTP 请求、发送短信、推送消息。外部副作用应放到事务提交后,或者通过 outbox 机制异步处理。

判断事务放哪的标准很简单:谁知道完整业务动作,谁就负责事务边界。

分类: GoFrame 实践 标签: GoFrame 事务 数据库

评论

-- 评论已关闭 --

全部评论