从业务的角度解决数据一致性问题

作者: 5e30faa7d323 | 来源:发表于2017-10-30 16:33 被阅读33次

缘起:在高并发的分布式环境下,对于数据的查询与修改容易引发一致性问题,本文将分享一种非常简单但有效的优化方法。

一、业务场景
业务场景为,购买商品的过程要对余额进行查询与修改,大致的业务流程如下:
(1)从数据库查询用户现有余额SELECT money FROM t_yue WHERE uid=$uid,不妨设查询出来的$old_money=100元

(2)业务层实施业务逻辑,比如购买一个80元的商品,并且打九折
if($old_money> 80 * 0.9) $new_money=$old_money-80*0.9=28

(3)将数据库中的余额进行修改 UPDATE t_yue SET money=$new_money WHERE uid=$uid

在并发量低的情况下,这个流程没有任何问题,原有金额100元,购买了80元的九折商品(72元),剩余28元。

二、潜在的问题
在分布式环境中,如果并发量很大,这种“查询修改”的业务很容易出现数据不一致。极限情况下,可能出现这样的异常流程:
(1)业务1和业务2同时查询余额,是100元

(2)业务1和业务2进行逻辑计算,算出各自业务的余额,假设业务1算出的余额是28元,业务2算出的余额是38元


(3)业务1对数据库中的余额先进行修改,设置成28元。
业务2对数据库中的余额后进行修改,设置成38元。



此时异常出现了,原有金额100元,业务1扣除了72元,业务2扣除了62元,最后剩余38元。

三、问题原因
高并发环境下,对同一个数据的并发读(两边都读出余额是100)与并发写(一个写回28,一个写回38)导致的数据一致性问题。

四、原因分析

业务1的写回:原有金额100,这是一个初始状态,写回金额28,理论上只有在原有金额为100的时候才允许写回成功,这一步没问题。

业务2的写回:的原有金额100,这是一个初始状态,写回金额38,理论上只有在原有金额为100的时候才允许写回成功,可实际上,这个时候数据库中的金额已经变为28了,这一步的写操作不应该成功。

五、简易解决方案
在set写回的时候,加上初始状态的条件compare,只有初始状态不变时,才允许set写回成功,这正是大家常说的“Compare And Set”(CAS),是一种常见的降低读写锁冲突,保证数据一致性的方法。

六、业务的升级
业务线使用CAS解决高并发时数据一致性问题,只需要在进行set操作时,compare一下初始值,如果初始值变换,不允许set成功。
对于上文中的业务场景,只需要将UPDATE t_yue SET money=$new_money WHERE uid=$uid升级为
UPDATE t_yue SETmoney=$new_money WHERE uid=$uid AND money=$old_money即可。
并发操作发生时:

业务1执行 => UPDATE t_yue SET money=28 WHERE uid=$uid AND money=100

业务2执行 => UPDATE t_yue SET money=38 WHERE uid=$uid AND money=100
【这两个操作同时进行时,只能有一个执行成功】

七、怎么判断哪个执行成功,哪个执行失败
set操作,其实无所谓成功或者失败,业务能通过affect rows得知哪个修改没有成功:
执行成功的业务,affect rows为1
执行失败的业务,affect rows为0

八、总结
高并发“查询并修改”的场景,可以用CAS(Compare and Set)的方式解决数据一致性问题。对应到业务,即在set的时候,加上初始条件的比对。

参考原文:巧用CAS解决数据一致性问题

相关文章

  • 从业务的角度解决数据一致性问题

    缘起:在高并发的分布式环境下,对于数据的查询与修改容易引发一致性问题,本文将分享一种非常简单但有效的优化方法。 一...

  • 换位思维

    从别人的角度考虑问题,是解决自己烦恼的方法;从长远的角度考虑问题,是解决眼前问题的方法。 ​​ ——达真堪布 ​​​

  • day12 主从复制高级进阶

    八、过滤复制 主库:(了解) 从库: 例: 九、半同步复制 解决主从数据一致性问题 9.1 半同步复制工作原理的变...

  • 非知名企业“抢人”秘籍

    “业务达成的核心因素是人,从人力资源角度讲,业务的问题就是人的问题。” -- 点我达招聘总监 Eric 濮声扬 曾...

  • 从问题的角度收获人生指南

    人生的历程如果从问题的角度来看,那就是发现问题--解决问题--再到发现新问题--解决新问题.....的一段历程,...

  • 狡猾的便便

    外化:把问题和人分开,和人一起讨论问题,从问题的角度而非从人的角度探讨解决问题的办法。 举个栗子:7岁的保罗经常出...

  • 维度和智慧,扬起理想的风帆

    维度,观察问题,思考问题的角度,简称维度,是从多个角度来分析和解决问题,形成对事物更准确的认知。 我们不要逃避问题...

  • 关于用户、场景、问题、解决方案的简单梳理

    1、产品是用来解决用户问题的(工作+生活)。 2、对于产品需要解决哪个问题(关键业务)的分析过程 2.1 从市场机...

  • Spark数据倾斜

    Spark数据倾斜解决方案 主要从业务理解和数据设计角度来解决

  • 数据科学

    做数据科学相关的工作,本质上是从数据的角度去解决业务问题。 我遇到一个很有意思的现象,很多朋友喜欢问,哎你用的是什...

网友评论

    本文标题:从业务的角度解决数据一致性问题

    本文链接:https://www.haomeiwen.com/subject/hhivextx.html