mysql 使用cas更新性能会比select for update更好吗

发布于 2022-09-04 23:03:53 字数 849 浏览 16 评论 0

有一个抢红包场景更新红包的剩余数量和剩余金钱,
是使用类似cas的更新还是先select for update性能高?
不管哪种方式在update那一步会等待,cas感觉会有很多无效更新尝试。
参考的文档地址: url

while (hadHongBao()) {
    //剩余红包个数
    def remainCount = getRemainCount() 
    //实时计算获取红包金额
    def getAmount = calculateAmount() 
    def result = sql.excute("update '红包计算表' set balance=${total-getAmount}, remainCount=${remainCount-1} where remainCount=${remainCount} and id=${id}")
    // 更新失败既继续执行循环,直到更新成功或已领取完,达到CAS效果
    if (result > 0) {
        // 更新成功,执行更新缓存等后续操作
        // ......
        break
    }
}

语句

 update window_red_pack
     set remain_price=#{remainPrice}, remain_num=#{remainNum}
     where id=#{redPackId} and  remain_price=#{expectedPrice} and  remain_num=#{expectedNum}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七度光 2022-09-11 23:03:53

阿里巴巴的开发规范上提到,在并发不高的情况下(尝试失败率不超过20%的情况下),推荐用cas更新。

如果MySQL用InnoDB引擎的话(UPDATE会用行锁),几乎很难碰到尝试失败的情况(除非某种表就只有没几行,但又是被频繁更新的)。(这也反映了并发编程Debug和Test的困难,但也有些技巧,比如故意在同一时刻开很多线程对同一行做更新。)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文