国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

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

发布时间:2019/09/09标签:   测试    点击量:

原标题:并发扣款一致性,幂等性问题,这个话题还没聊
《并发扣款,怎样保障数据的分歧性?》,分享了统一个用户并发扣款时,有必定几率呈现数据纷歧致,能够应用CAS悲观锁的方法,在不下降吞吐量,而且只要大批修正的情形下,保障数据的分歧性。文章公布不到24小时,就有近200的批评。此中,问的比拟多的是ABA成绩,这个成绩曾经在《并发扣款分歧性优化,CAS下ABA成绩,这个话题还没聊完!!!》中扩大。 其次,问的比拟多的是功课题,为甚么必定要用select&set的方法停止余额写回:UPDATEt_yueSETmoney=$new_moneyWHEREuid=$uidANDmoney=$old_money;为甚么不能采纳间接扣减的方式:UPDATEt_yueSETmoneymoney=money-$diffWHEREuid=$uid;很人说,在并发情形下,会将money扣成正数。 为了保障余额不被扣成正数,再加一个where前提:UPDATEt_yueSETmoneymoney=money-$diffWHEREuid=$uidANDmoney-$diff>0;如许能否可行?画外音:额,撇停业务不谈,这个SQL用列做运算,实在是欠好的,倡议应用:UPDATEt_yueSETmoneymoney=money-$diffWHEREuid=$uidANDmoney>$diff;很遗憾,依然不可。起因在《并发扣款,怎样保障数据的分歧性?》一文里点赞最多的批评,不幂等。画外音:阐明绝大局部同窗,可能答复准确功课。 聊幂等性之前,先看另一个测试用例的case。 假定有一个效劳接口,注册新用户:boolRegisterUser($uid,$name){//检查uid能否曾经存在selectuidfromt_userwhereuid=$uid;//不是新用户,前往失利if(rows>0)returnfalse;else{//把新用户拔出用户表insertintot_uservalues($uid,$name);//前往胜利returntrue;}}有一个测试工程师,对该接口写了一个测试用例:boolTestCase_RegisterUser(){//造一些假数据longuid=123;Stringname='shenjian';//挪用被测试的接口boolresult=RegisterUser(uid,name);//预期注册胜利,对成果停止断言推断Assert(result,true);//前往测试成果returnresult;}这是不是一个好的测试用例?这个用例存在甚么成绩?你会发觉,雷同前提下,这个测试用例履行两次,失掉的成果纷歧样: 第一次履行,第一次造数据,挪用接口,注册胜利; 第二次履行,又造了一次雷同的数据,挪用接口,注册会失利;这不是一个好的测试用例,屡次履行成果差别。甚么是幂等性?雷同前提下,履行统一恳求,失掉的成果雷同,才合乎幂等性。画外音:Google一下,比我说明得更好,但意义应当说清晰了。怎样将下面的测试用例改成合乎“幂等性”的测试用例呢?只要要加一行代码:boolTestCase_RegisterUser(){//造一些假数据longuid=123;Stringname=’shenjian’;//先删除这个捏造的用户DeleteUser(uid);//挪用被测试的接口boolresult=RegisterUser(uid,name);//预期注册胜利,对成果停止断言推断Assert(result,true);//前往测试成果returnresult;}

上一篇:没有了

下一篇:没有了

返回
版权信息Copyright © 银河官网 版权所有    ICP备案编号:鲁ICP备09013610号