请教个事务的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
craftx
V2EX    问与答

请教个事务的问题

  •  
  •   craftx 2023 年 5 月 19 日 2417 次点击
    这是一个创建于 992 天前的主题,其中的信息可能已经有所发展或是发生改变。
    举个例子,支付订单:
    1. 将订单状态改为已支付
    2. 记录支付数据
    3. 调用库存服务的 http api 接口,减库存并发货

    以上三个操作,需要是一个原子操作,要么一起成功,要么一起失败。
    1 、2 好说,都是数据库操作,一个事务就 ok 。
    但 3 是另一个类型的操作。

    我想到方案是:
    1. 3 放在事务中,3 成功再提交事务,否则回滚。缺点是 3 会卡事务,只适用于流量特别低,3 执行很快的系统。
    2. 3 放队列中,失败了重试。缺点有 2:a ,放队列的操作也可能失败,除非放队列的操作也放事务中; b ,3 可能永远不会成功。
    16 条回复    2023-05-19 15:59:22 +08:00
    lthon
        1
    lthon  
       2023 年 5 月 19 日 via Android
    这是分布式事务啊,看有没有大佬回答
    hhjswf
        2
    hhjswf  
       2023 年 5 月 19 日 via Android
    @lthon 就这么点事用分布式事务,系统复杂度直接上一个等级
    dzdh
        3
    dzdh  
       2023 年 5 月 19 日
    ID 密等

    有个协调者负责协调即可。或者是共同消费消息。
    zhuzhibin
        4
    zhuzhibin  
       2023 年 5 月 19 日 via iPhone
    如果我请求外部接口中途被退出了,我方数据没有变更,外部系统数据变更了咋搞
    dzdh
        5
    dzdh  
       2023 年 5 月 19 日
    httpapi 一般给两个接口。一个根据指定单号查询,一个下单,下单必传业务方自己的单号,并且返回服务的单号(流水号)

    下单前先按照业务方已经生成入库的单号进行查询,做同步,防止多下单。
    blackvv666
        6
    blackvv666  
       2023 年 5 月 19 日
    mq 保障最终一致

    如果失败多次,直接转人工。
    sadfQED2
        7
    sadfQED2      2023 年 5 月 19 日 via Android
    改一下执行顺序?先扣库存,扣成功了再改状态
    kylinC
        8
    kylinC  
       2023 年 5 月 19 日
    最简单的方法是设置一个中间态, 1,2 成功了订单改为支付成功未发货,然后放队列执行 3, 定时检查支付成功未发货订单作为补充.缺点是时效性不高.
    wolfie
        9
    wolfie  
       2023 年 5 月 19 日
    支付前,锁库存。
    取消支付 or 支付失败,回滚库存。
    wqq096737ink
        10
    wqq096737ink  
       2023 年 5 月 19 日
    异步操作 ,线程 1 先扣库存 ,线程 2 执行事务,根据线程 1 的请求调用是否成功来决定是否提交事务。

    如果你觉得线程 2 需要等待线程 1 的结果造成线程 2 事务太长,那么就 扣库存-->订单事务 同步执行。


    你的方案 1 中调用接口没必要一定要放到事务中把?
    IDAEngine
        11
    IDAEngine  
       2023 年 5 月 19 日
    sega 模式
    7911364440
        12
    7911364440  
       2023 年 5 月 19 日
    先执行 3 ,扣库存,库存扣失败直接返回,1 跟 2 直接放在本地事务就 ok 。
    opengps
        13
    opengps  
       2023 年 5 月 19 日
    有个定义叫做“最终一致性”。关于原子性,只要你能保证最终一致性,就可以只在第一步进行控制,也算符合原子性操作
    lincanbin
        14
    lincanbin  
       2023 年 5 月 19 日
    给订单加个锁,上锁期间禁止所有操作。
    全部搞成功再解锁,然后定时去扫出来所有没全部成功的数据出来处理就好了。
    wawaguo
        15
    wawaguo  
       2023 年 5 月 19 日
    3 改成扣库存 mq 消息,1 、2 、3 放同个事务,最后发送 mq 消息的时候报错就把 12 回滚,不报错就提交事务,需要做业务幂等
    CantSee
        16
    CantSee  
       2023 年 5 月 19 日
    哪那么多事,订单创建时候就锁定库存了,到时间再同步释放库存和取消订单,支付时候由于库存是已经锁定的了,只需要关注支付状态就可以了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2756 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 04:33 PVG 12:33 LAX 20:33 JFK 23:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86