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

UI设计

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

并发扣款一致性优化,CAS下ABA问题,这个话题还

发布时间:2019/09/05标签:   余额    点击量:

原标题:并发扣款一致性优化,CAS下ABA问题,这个话题还
上一篇答星球水友发问,《并发扣款,怎样保障数据的分歧性?》中提到:用CAS悲观锁,能够在只管不影响吞吐量的情形下,保障数据的分歧性。各人有十分多的留言,大略有这么几类: 能否存在ABA成绩? 为甚么不能用: UPDATEt_yueSETmoneymoney=money-$diffANDmoney>=$diff; 是否借助redis事件来扣减余额;画外音:请务必浏览前序言章:《并发扣款,怎样保障数据的分歧性?》。成绩比拟多,明天先聊第一个成绩,ABA。甚么是ABA成绩?CAS悲观锁机制确切可能晋升吞吐,并保障分歧性,但在极其情形下能够会呈现ABA成绩。斟酌以下操纵: 并发1(上):猎取出数据的初始值是A,后续打算实行CAS悲观锁,冀望数据还是A的时间,修正才干胜利 并发2:将数据修正成B 并发3:将数据修正回A 并发1(下):CAS悲观锁,检测发觉初始值仍是A,停止数据修正上述并发情况下,并发1在修正数据时,固然仍是A,但曾经不是初始前提的A了,旁边产生了A变B,B又变A的变更,此A曾经非彼A,数据却胜利修正,能够招致过错,这就是CAS激发的所谓的ABA成绩。余额操纵,呈现ABA成绩并不会对营业发生影响,由于关于“余额”属性来讲,前一个A为100余额,与后一个A为100余额,实质是雷同的。但其余场景一定是如许,举一个客栈操纵的例子:并发1(上):读取栈顶的元素为“A1”并发2:停止了2次出栈并发3:又停止了1次出栈并发1(下):实行CAS悲观锁,发觉栈顶仍是“A1”,因而修正为A2此时会呈现体系过错,由于此“A1”非彼“A1”ABA成绩能够怎样优化?ABA成绩招致的起因,是CAS进程中只简略停止了“值”的校验,再有些情形下,“值”雷同不会引入过错的营业逻辑(比方余额),有些情形下,“值”固然雷同,却曾经不是本来的数据了(比方客栈)。因而,CAS不能只比对“值”,还必需确保是本来的数据,才干修正胜利。罕见的实际是,将“值”比对,进级为“版本号”的比对,一个数据一个版本,版本变更,即便值雷同,也不该该修正胜利。余额并发读写例子,引入版本号的详细实际以下:(1)余额表要进级。t_yue(uid,money)

版权信息Copyright ? IT技术教程 版权所有??? ICP备案编号:鲁ICP备09013610号