前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >CAS下的ABA问题及优化方案!技术交流,没必要张口闭口就...(第44讲)

CAS下的ABA问题及优化方案!技术交流,没必要张口闭口就...(第44讲)

作者头像
架构师之路
发布2025-03-11 21:09:06
发布2025-03-11 21:09:06
260
举报
文章被收录于专栏:架构师之路架构师之路

《架构师之路:架构设计中的100个知识点》

44.ABA问题

库存扣减异常怎么办?(41)》采用CAS思想,两行代码解决并发扣减异常。

图片
图片

有童鞋留言:那ABA问题呢?

今天和大家聊聊CAS下的ABA问题。

前文回顾:

如何巧用CAS机制,1行代码搞定并发导致的库存异常问题?

图片
图片

将库存设置接口执行的:

update stock set num=$y where sid=$sid

升级为:

update stock set num=$num_new where sid=$sid

and num=$num_old

画外音:加了一个初始条件比对。

这样的话,两个并发的库存设置,只会有一个成功,保证了数据的一致性。

可能存在什么问题?

CAS乐观锁机制确实能够提升吞吐,并保证一致性,但在极端情况下可能会出现ABA问题。

什么是ABA问题?

考虑如下操作:

1. 并发1(上):获取出数据的初始值是A,后续计划实施CAS乐观锁,期望数据仍是A的时候,修改才能成功;

2. 并发2:将数据修改成B;

3. 并发3:将数据修改回A;

4. 并发1(下):CAS乐观锁,检测发现初始值还是A,进行数据修改;

上述并发环境下,并发1在修改数据时,虽然还是A,但已经不是初始条件的A了,中间发生了A变B,B又变A的变化,此A已经非彼A,数据却成功修改,可能导致错误,这就是CAS引发的所谓的ABA问题。

库存操作,出现ABA问题并不会对业务产生影响。

再看一个堆栈操作的例子:

图片
图片

并发1(上):读取栈顶的元素为“A1”;

图片
图片

并发2:进行了2次出栈;

图片
图片

并发3:又进行了1次出栈;

图片
图片

并发1(下):实施CAS乐观锁,发现栈顶还是“A1”,于是修改为A2;

图片
图片

此时会出现系统错误,因为此“A1”非彼“A1”。

为什么会导致ABA问题?

ABA问题导致的原因,是CAS过程中只简单进行了“值”的校验,再有些情况下,“值”相同不会引入错误的业务逻辑(例如库存),有些情况下,“值”虽然相同,却已经不是原来的数据了。

ABA问题如何优化?

CAS不能只比对“值”,还必须确保的是原来的数据,才能修改成功。

最常见的实践是:通过“版本号”比对,一个数据一个版本,版本变化,即使值相同,也不应该修改成功。

库存的并发读写例子,引入版本号的具体实践如下:

(1)库存表由

stock(sid, num)

升级为

stock(sid, num, version)

(2)查询库存时同时查询版本号

select num from stock where sid=$sid

升级为

select num, version from stock where sid=$sid

图片
图片

假设有并发操作,都会将版本号查询出来

(3)设置库存时,必须版本号相同,并且版本号要修改

旧版本“值”比对CAS

update stock

set num=num_new where sid=sid

and num=$num_old

升级为“版本号”比对CAS

update stock

set num=num_new, version=version_new

where sid=sid and version=version_old

图片
图片

此时假设有并发操作,第一个操作,比对版本号成功,于是把库存和版本号都进行了修改。

图片
图片

同时存在的第二个并发操作,比对版本号发生了变化,也是库存应该修改失败。

稍作总结

1. select&set业务场景,在并发时会出现一致性问题;

2. 基于“值”的CAS乐观锁,可能导致ABA问题;

3. CAS乐观锁,必须保证修改时的“此数据”就是“彼数据”,应该由“值”比对,优化为“版本号”比对;

另外,具体到库存业务,如果之前没有设计版本号,使用“值对比”就可以了,没有必要大费周章升级为为“版本号对比”。技术方案,是为了解决问题,而不是为了炫技。

知其然,知其所以然。

思路比结论更重要。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档