高并发下投标过程进行优化

原创 2015年11月18日 11:33:24

业务流程


对于一个融资标的invest表, 标的id,标的总融资金额(total_money), 已投资金额(invested_money),满标时间(finish_invest_time),标的状态(status)

假如有多个用户user同时投标,投资金额为M,  为保证数据一致性,以下步聚在同一个事务当中

1.  查询left = total_money - invested_money, 如果left <=0, 则不可投, 如果M > left, 则提示投资金额不能大于剩余可投金额

2. 查询用户资金余额balance, 如果balance<M, 则提示用户账户余额不足请先充值

3. int rows = update user表set balance = balance - M where id = ? and balance - M >=0,如果rows=0,则回滚

4. 插入记录到已投资列表表中insert into invest_list表

5. int rows = update invest表 set invested_money = invested_money + M where id = ? and invested_money + M <= total_money, 如果rows=0则事务回滚

6. 查询left = total_money - invested_money,如果left=0,则更改状态status为'还款中',满标时间为当前时间

7.给用户发送短信或邮件提示投标成功


如果按照此事务流程,系统最容易堵塞在步骤5中,系统的并发度比较低, 所以计划采用异步队列的方式

 将标的id,和可投资金额left=total_money - invested_money保存在内存ConcurrentHashMap中, 当用户投资金额M时, left = left - M,如果left> 0时,表示可投,则分出一个线程并在同一个事务中用来执行如下操作

1. 查询用户资金余额balance, 如果balance<M, 则提示用户账户余额不足请先充值,并将map中left加回M

2. int rows = update user表set balance = balance - M where id = ? and balance - M >=0,如果rows=0,则回滚并将map中left加回M

3. 插入记录到已投资列表表中insert into invest_list表,并将该用户投资记录放到一个queue中去

4. 从queue中取出该用户投资记录,并异步执行上一个事务的5、6、7步聚


总结, 想方设法将单事务任务转变成多线程任务来执行, 使用消息队列来达到最终一致性



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

PHPer必知:高并发网站应该如何进行优化?

PHPer打交道最多的就是网站。一个没有流量的网站,毫无疑问不能说有价值的网站。但是如果手里管理的网站是高并发、大流量的网站,虽然是好事,但是如果处理不好,就会导致网站访问缓慢,用户体验极度不好。那么...

招投标过程---投标之述标 大杂烩

唱标与述标 唱标 简介  开标时,公开宣读投标人关于投标人报价、工期、质量、工程项目经理等招标人有实质要求的内容。唱,意即大声地公布。唱标人可以是投标人,也可以是参加开标会的其他工作人员,但除投标...
  • wlanye
  • wlanye
  • 2011-09-06 21:43
  • 4837

不适用临时表进行分页,筛选,查询,避免高并发的方法。

 ALTER proc [dbo].[GetD_OrderInfoCollectionForPaging] (         @PageIndex int,     -...

高并发性的设计和优化

  • 2016-10-31 22:27
  • 1.55MB
  • 下载

【开卷有益】记录一次高并发下的死锁解决思考过程

文章可能看不出来我在做什么事情,只是记录自己的一个排除死锁的过程。

海量数据、高并发优化方案

一.应用服务器负载均衡  1.链路负载均衡  通过DNS解析域名时,将客户端的访问解析成不同的IP,分配到不同的入口,同时尽可能保证所访问的入口是所有入口中可能较快的一个。  2.软件负载均衡 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)