关于校验与确认两步操作时,新增,修改需要考虑的问题

业务场景

1.有这样兑奖的活动,【活动1】小票满指定金额换奖品,【活动2】买饮料,瓶盖暗码兑奖

第一步,【校验按钮】拍身份证图片,获取身份证信息;输入小票号或输入暗码,校验是否被使用过(查询是否存在记录);暗码是否有效(提前初始化到暗码表)

第二步,【确认按钮】第一步校验通过,新增兑奖记录,更新暗码状态。

风险点是小票号或暗码是否会被重复使用,类似并发问题

异常场景

同一个小票或者暗码,两个人同时操作,第一步都校验通过了(无记录),再去确认操作,可能导致,小票或暗码被重复使用,正常新增了记录,更新了暗码状态

解决方案

新增时记录表加唯一索引(小票号),更新状态加乐观锁(暗码)

这样就算第一步校验都通过了,新增小票记录时,可捕获唯一索引异常,抛异常,提示小票已被使用,更新暗码状态条件是原始状态是0有效才更新,判断返回值是否为1,是更新成功,否,暗码已被更新,提示暗码已被使用。

拓展方案:加redis分布式锁

疑问

1.新增或者修改,有必要判断返回值是否为1,说明是否成功吗?

新增:什么场景下会不等1,失败的情况,新增时如果加了唯一索引,直接抛异常,判断是否为1没意义,不知道是否存在其他场景新增失败

修改:加了乐观锁,必须要判断是否等于1,来给出提示。

2.大数量新增或批量更新怎么处理

新增:分批操作,捕获异常,打印ERROR日志,或者写入错误日志表

修改:打印ERROR日志,或者写入错误日志表

你可能感兴趣的:(并发,java)