GoFrame g.DB 事务写法:边界要在用例层
事务最怕散落在多个 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 事务 数据库
版权申明
本文系作者 @blogger 原创发布在GoFrame g.DB 事务写法:边界要在用例层。未经许可,禁止转载。
评论
-- 评论已关闭 --
全部评论