编程经验点滴----使用接口表保存可能并发的业务,然后顺序处理

Posted Jacklondon Chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程经验点滴----使用接口表保存可能并发的业务,然后顺序处理相关的知识,希望对你有一定的参考价值。

  这篇文章的主要内容,来自与其他人的讨论。

  软件系统的开发或设计时,容易遇到有并发的情况。有时候需要刻意去避免,防止数据错误。比如超市卖商品,可能两个柜台同时卖出一款矿泉水,如果软件系统后台需要跟踪每个商品的库存,此时就需要特别考虑。如果两个柜台,同时采取"读当前库存,减一,得到最新库存,保存"的设计,则可能会导致数据错误。比如,两个柜台,读当前库存,都得到 100, 减一,都得到99,作为最新数据保存,保存99。最后,尽管同时卖出了两瓶矿泉水,最后系统的库存确是99。无疑是有问题的。

  一个简单的解决办法,就是再设计一个接口表。对于有可能并发的操作,统一插入一条"待处理的操作指令"到此接口表中,然后单独起一个线程,逐个处理此接口表中待处理数据。

  大致步骤如下:1. 并发处理,统一插入一条待处理的操作指令到此接口表中,只 insert:
insert into ti_xxx ....; --process_flag = 0

2. 单独起一个线程,逐个读 : ti_xxx 中未处理的数据.
2.1
select top 1 from ti_xxx where process_flag = 0 order by increase_key,created_time;

2.2. insert/update 到 tt_xxx :
if exists(select 1 from tt_xxx where ....)
  update tt_xxx ....
else
  insert into tt_xxx...

2.3 更新 ti_xxx 数据为已处理:
update ti_xxx set process_flag = 1 where increase_key = xxx;

其中,ti_xxx 表使用自增长主键,或使用 uuid 做主键。

 

  如果只是单纯的超市软件系统,它的库存计算,其实不用很实时。让管理员人员,看当前时间的库存,与看5分钟之前的库存,从纯粹的管理层面,并没有大的区别。实际上,绝大多数系统,数据的实时性要求,都没有高到需要完全实时。另一方面,此类系统对数据的最终准确性,要求却是非常高的。比如,客户不太在意,9:05 分卖出一款矿泉水,只能在 9:10看到库存减少。但客户在意的是,9:05 分时刻卖出一款矿泉水,至少在下班后(21:00),能看到结果。

  如果我们将以上所述"单独起一个线程",做成每 0.5秒 运行一次的定时任务,则对于客户来说,完全看不到影响。

 

以上是关于编程经验点滴----使用接口表保存可能并发的业务,然后顺序处理的主要内容,如果未能解决你的问题,请参考以下文章

并发编程基础篇——第一章(并发相关基础概念理解)

Day623.并发编程工具类库使用错误问题 -Java业务开发常见错误

千万pv大型web系统架构,学习从点滴开始

python学习点滴记录-Day08

php 函数使用经验点滴1

javaweb把请求保存到队列里。高并发