为了账号安全,请及时绑定邮箱和手机立即绑定

java高并发下,前台购买,同时后台修改,怎么设计不会有脏数据?

java高并发下,前台购买,同时后台修改,怎么设计不会有脏数据?

蛊毒传说 2019-01-18 19:52:03
java代码,用的mongodb数据库,业务场景就是几个商品,前台可以购买,后台可能会在同一时刻修改库存或者上下线商品,怎么设计保证不会产生脏数据。我是新手,目前我的想法是在service层写一个上锁的方法, public String update(int type, String id, int sum, int status){ synchronized (id.intern()) { switch(type){ case 1: //type为1,前台购买,更改库存sum break; case 2: //type为2,后台修改,更改库存sum(追加,不直接修改),状态status break; default: break; } } } 但是这样也不太好,如果后台减数量存在负数可能,各位前辈你们是怎么做的,我工作没多久也没啥思路求指路QAQ
查看完整描述

4 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

首先赞同 捏造的信仰 的观点,先review下业务是否合理,逻辑是否正确
防止并发一般有几种方式:

  1. 利用数据库本身的乐观锁机制,这种一般适用于并发冲突概率较小的情况,即乐观的认为不会引起冲突,如果高并发导致同一商品的修改冲突概率非常大,乐观锁显然不太合适,会导致一方的操作失败
  2. 通过代码实现内存级别的串行,即楼主使用的锁机制,此类方法使代码复杂度升高,且会影响性能,不太建议
  3. 通过消息队列,将并发操作串行化处理,然后使用合适逻辑处理统一商品的同时修改(其实已经变成串行了)
查看完整回答
反对 回复 2019-03-01
?
慕斯王

TA贡献1864条经验 获得超2个赞

首先,原则上每个订单都要对应到该商品的一个快照,也就是说购买之后不论怎么改商品信息,都不影响订单本身。其次如果商品信息本身的修改涉及多个数据库操作,那么必须做成事务;如果实在无法实现事务,就必须对商品暂时下线,完成修改之后再重新上线。

查看完整回答
反对 回复 2019-03-01
?
心有法竹

TA贡献1866条经验 获得超5个赞

使用 mongo 自带的乐观锁就好了,具体例子如下:

# 假设你的记录如下
{ 
    "_id" : ObjectId("5abf230cafcbb810e52f2e6e"), 
    "count" : 2
}

# 多线程并并发修改记录时,调用方法如下:

db.demo.update(
    {count: {$gt: 0},"_id" : ObjectId("5abf230cafcbb810e52f2e6e")},
    {$inc :{count :-1} }
)

# 因为 update 的执行是原子性的,当你的 count =0 后, update 就不会生效了。
# 判断返回结果就可以了。
查看完整回答
反对 回复 2019-03-01
  • 4 回答
  • 0 关注
  • 491 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信