PostgreSQL 的 pg_try_advisory_xact_lock 正确使用姿势是什么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dzdh

PostgreSQL 的 pg_try_advisory_xact_lock 正确使用姿势是什么

  •  
  •   dzdh 2021 年 7 月 4 日 2134 次点击
    这是一个创建于 1755 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到 pg_try_advisory_xact_lock (咨询锁)可以事务中免等待

    实际场景是啥?

    看很多描述是秒杀场景,那就拿秒杀来说,,一件商品,多人下单,那就是多个事物,只有一个人能下单(扣减库存)成功。

    然后没拿到锁的呢?直接前端抛出个抢购失败的异常?然后刷新页面一看还有库存?业务代码逻辑自动重试?重试多少次呢?

    因为很多场景其实并不都是极限秒杀场景(成百上千人抢),可能就是平常的一个商品,某个店铺搞了个活动(平台也不晓得)突然就大流量上来了。

    就是不固定不定时毫无预兆的普通商品抢购,自动重试次数少了,刷新页面看还有库存。自动重试次数多了,那还不如事物里锁这条数据呢。

    更具体的使用场景或姿势是啥?

    6 条回复    2021-07-05 10:05:54 +08:00
    dzdh
        2
    dzdh  
    OP
       2021 年 7 月 4 日
    @liprais 就是看了这个。业务中如何实现呢。

    非秒杀,两个用户同时请求,一个成功,另一个告知稍后重试?还是抛个异常说库存不足了?没拿到锁的在业务代码中自动重试?重试多少次呢?重试 3 次?那抢购场景重试三次后告知人太多刷新页面一看库存依然充足,再下单依然提示抢购人数太多?这体验并不觉得多好鸭。
    oclock
        3
    oclock  
       2021 年 7 月 5 日
    好几年不写后端,胡扯一句:“自动重试”通常是糟糕的设计
    dzdh
        4
    dzdh  
    OP
       2021 年 7 月 5 日
    @oclock 那这玩意儿存在的意义是啥,单纯保证同一时间能直接“取得”这条数据是否被锁的结果?那为何说适合秒杀呢
    MoYi123
        5
    MoYi123  
       2021 年 7 月 5 日
    个人观点不一定对。
    这个锁在并发量小的时候,基本上是必定成功,在并发量大的时候,成功率也不低。
    一般来说,秒杀场景没有那么多的库存,如果参与的人多,那么再次刷新页面的时候,库存一定没了,如果人少,那就不会拿不到锁。
    dzdh
        6
    dzdh  
    OP
       2021 年 7 月 5 日
    @MoYi123

    >这个锁在并发量小的时候,基本上是必定成功,在并发量大的时候,成功率也不低。

    如,就两个并发,同一时间事务进来,必定有一个人拿不到锁然后就 GG 了?

    测试方法:就两个人同时点提交按钮。(查是否有重复订单、是否被限购、商品是否在售、用户是否登录、更新用户在线状态等等等巴啦啦)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2839 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 13:00 PVG 21:00 LAX 0600 JFK 09:00
    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