? 并发扣款一致性,幂等性问题,这个话题还没聊完!!!_CQITer_重庆IT人之家 yabo10.com亚博体育,亚博娱乐在线网站,亚博国际娱乐7171 ?

并发扣款一致性,幂等性问题,这个话题还没聊完!!!

并发扣款,如何保证数据的一致性?》,分享了同一个用户并发扣款时,有一定概率出现数据不一致,可以使用CAS乐观锁的方式,在不降低吞吐量,并且只有少量修改的情况下,保证数据的一致性

并发扣款一致性,幂等性问题,这个话题还没聊完!!!

文章发布不到24小时,就有近200的评论。

其中,问的比较多的是ABA问题,这个问题已经在《并发扣款一致性优化,CAS下ABA问题,这个话题还没聊完!!!》中扩展。 其次,问的比较多的是作业题,为什么一定要用select&set的方式进行余额写回:

UPDATE?t_yue?SET?money=$new_money?WHERE?uid=$uid?AND?money=$old_money;??

为什么不能采用直接扣减的方法:

UPDATE?t_yue?SET?moneymoney=money-$diff?WHERE?uid=$uid;?

很人说,在并发情况下,会将money扣成负数。 为了保证余额不被扣成负数,再加一个where条件:

UPDATE?t_yue?SET?moneymoney=money-$diff?WHERE?uid=$uid?AND?money-$diff>0;?

这样是否可行?画外音:额,撇开业务不谈,这个SQL用列做运算,其实是不好的,建议使用:

UPDATE?t_yue?SET?moneymoney=money-$diff?WHERE?uid=$uid?AND?money>$diff;?

很遗憾,仍然不行。原因在《并发扣款,如何保证数据的一致性?》一文里点赞最多的评论,不幂等。画外音:说明绝大部分同学,能够回答正确作业。 聊幂等性之前,先看另一个测试用例的case。 假设有一个服务接口,注册新用户:

bool?RegisterUser($uid,?$name){?

?????????//查看uid是否已经存在?

?????????select?uid?from?t_user?where?uid=$uid;?

?????????//不是新用户,返回失败?

?????????if(rows>0)return?false;?

?????????else{?

???????????????????//把新用户插入用户表?

???????????????????insert?into?t_user?values($uid,?$name);?

???????????????????//返回成功?

???????????????????return?true;?

?????????}?

}?

有一个测试工程师,对该接口写了一个测试用例:

bool?TestCase_RegisterUser(){?

?????????//造一些假数据?

?????????long?uid=123;?

?????????String?name='shenjian';?

?????????//调用被测试的接口?

?????????bool?result=?RegisterUser(uid,name);?

?????????//预期注册成功,对结果进行断言判断?

?????????Assert(result,true);?

?????????//返回测试结果?

?????????return?result;?

}?

这是不是一个好的测试用例?这个用例存在什么问题?

你会发现,相同条件下,这个测试用例执行两次,得到的结果不一样:

第一次执行,第一次造数据,调用接口,注册成功;

第二次执行,又造了一次相同的数据,调用接口,注册会失败;这不是一个好的测试用例,多次执行结果不同。

什么是幂等性?

相同条件下,执行同一请求,得到的结果相同,才符合幂等性。

画外音:Google一下,比我解释得更好,但意思应该说清楚了。

如何将上面的测试用例改为符合“幂等性”的测试用例呢?

只需要加一行代码:

bool?TestCase_RegisterUser(){?

?????????//造一些假数据?

?????????long?uid=123;?

?????????String?name=’shenjian’;?

?????????//先删除这个伪造的用户?

?????????DeleteUser(uid);?

?????????//调用被测试的接口?

?????????bool?result=?RegisterUser(uid,name);?

?????????//预期注册成功,对结果进行断言判断?

?????????Assert(result,true);?

?????????//返回测试结果?

?????????return?result;?

}?

这样,在相同条件下,不管这个用例执行多少次,得到的测试结果都是相同的。 是不是对幂等性有点感觉了。 读请求,一般是幂等的。

写请求,视情况而定:

insert x,一般来说不是幂等的,重复插入得到的结果不一定一样

delete x,一般来说是幂等的,删除多次得到的结果仍相同

set a=x是幂等的

set a=a-x不是幂等的

因此,这么扣减余额:

相关推荐
新闻聚焦
猜你喜欢
热门推荐
  • 微软AI面试题有多难?这里有一份样卷

      究竟什么样的AI人才能被微软这样的巨头聘用呢?今天,文摘君就淘来了几道微软AI 面试题,同时给出了最基本的解答......

    06-25????来源:澎湃新闻网

    分享
  • 腾讯吐个槽“讲产品故事拿大奖”活动:

      每一个产品故事都值得被聆听, 每一位奋斗者的历程都值得被肯定! 今天,「吐个槽」X「腾讯课堂产品学院」发起讲产品故......

    09-02????来源:未知

    分享
  • 全球最聪明的大脑怎么看AI?他们预测了

      2017年AI领域取得了诸多成果。2018年AI又将何去何从?以下是来自世界顶级研究人员和行业领军人物对2018年AI领域发展作......

    02-20????来源:虎嗅网

    分享
  • 2017JavaScript框架战报 - React分战场

      我们来看看与React有关的软件包的生态系统。当Facebook构建React时,就有许多来自开源社区的第三方软件包。为提供完......

    02-27????来源:湖北新闻网

    分享
  • 小白学数据:教你用Python实现简单监督学

      监督学习作为运用最广泛的机器学习方法,一直以来都是从数据挖掘信息的重要手段。即便是在无监督学习兴起的近......

    03-05????来源:今日头条

    分享
  • 现代编程语言Swift、Kotlin等十大有趣功能

      最近学习了一些现代编程语言,比如Reason,Swift,Kotlin和Dart。这些编程语言提供了许多新功能,本文主要分享了我认......

    04-29????来源:祁东新闻网

    分享
  • 领域场景分析的6W模型

      组成场景的要素常常被称之为6W模型,即描写场景的过程必须包含Who,What,Why,Where,When与hoW这六个要素。......

    04-30????来源:砍柴网

    分享
  • 开源应用服务器WildFly 12发新季度交付模式

      WildFly 12 Final版本现在已经可以下载了,WildFly是一款灵活的开源应用服务器,支持开发人员构建轻量级应用程序。支持......

    05-10????来源:青岛新闻网

    分享
  • 基于Spring Cloud的微服务落地

      微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,......

    06-04????来源:广西新闻网

    分享
  • 为什么阿里工程师纷纷在内网晒代码?

      前阵子,在阿里一个小黑屋里,5名对代码有着极致追求的工程师参与阿里代码领域最高荣誉“多隆奖”的最终角逐。......

    06-08????来源:四川新闻网

    分享
返回列表
Ctrl+D?将本页面保存为书签,全面了解最新资讯,方便快捷。