用户投标是P2P网络借贷系统的核心功能。相对照较复杂,为了更好地梳理业务和技术实现思路,特地具体总结分析下。
输入:用户id-uid。标的id-lid。投标金额-amount
1.依据lid,获得贷款标的信息(优先从Cache中取),不能为null,状态status应该“合法”。
假设贷款标不存在,或者状态不正确,马上返回到前端。不再继续后面的处理。
2.依据uid。查询用户的信息。
贷款标的和用户信息是投标逻辑须要的。
3.投标检查。
用户的账户是否存在、账户剩余金额是否超过了投标金额amount。
4.依据uid、lid、amount等參数,构造投标tender对象。包括了投标须要的全部信息。
5.获得投标状态信息(事务锁住抢标状态。防止多个用户同一时候投标。使用数据库行级锁,分布式情况下也能够使用)。
使用select ... for update 语句
6.累计投标金额,即把当前的投标总额加上当前投标用户的“金额”。
这里面存在一个“争议”,假设标的总额2000,已经投了1800。用户投了300,这个时候300>200。理论上不能成功。
假设不成功,用户抢到标却无法投。可能非常伤心;假设让用户投,有的用户想“整投”。不想把钱“打散”。也可能非常伤心。
为了简化处理。一种方式是,把用户投标的钱算成200,即最大可投资金额。
7.更新投标状态。
8.保存投标信息tender对象。
9.扣除用户的账户钱,减去刚刚投资的金额。实际操作为把用户账户的钱转到平台账户下。
存在一个问题,一次标。把全部用户的钱,转到平台账户,会须要非常多次转账。
因此,设立一个比較特殊的“中间账户”,全部用户的钱都转到“中间账户”,等标满了,一次性把中间账户的钱转到平台账户下。
10.返回投标信息。是否成功。投标金额等。
投标过程中的注意事项:
1.开启事务。
2.数据库行级锁,锁住投标状态。
3.检查用户的可投资金额等前提条件检查。
4.平台设立中间账户,降低转账产生的流水记录。