开发者社区 问答 正文

多进程(项目)对单表操作的问题?:报错

oracle数据库,用户表有有余额,冻结款 2个字段。 

1)用户投标,要校验用户余额是否可用,余额可用的时候,投标(加入订单表),扣除余额,增加冻结款;

2)扣费进程,一直扫描订单表。扫描到有订单时,进行判断投标是否满了。 满了,扣除冻结款。不满标撤了则 返回冻结款到余额去,余额新增。

问题:  如果保证 校验过程中,读取余额字段不会读取到扣费进程修改前的数据?注意,这里是两个进程对数据的操作。

@红薯



展开
收起
kun坤 2020-06-07 20:15:45 631 分享 版权
1 条回答
写回答
取消 提交回答
  • 扣费进程锁住(lock)要操作的用户表的数据。

    但是处理的用户很多的话,最后被处理的用户会面对什么画面?

    看你的设计,用户投标和扣费进程是同时进行的,为什么要多进程?为什么还加个冻结款字段?用户投标到余额扣除应该是1个事务的处理才正常吧。不知道你是否有什么特殊要求。

    ######回复 @Chen大猩猩 : 总之,扣费进程的卡死不解决,扣费和投标不能同步,无解。给点建议,你的扣费进程应该像个批处理,只处理余额扣除,不处理其他东西,也就是余额不扣除的判断,与后续处理不在扣费进程中执行。而余额扣除的处理(扣费进程)也不需要(认为不可能)与用户进程同步,虽然余额没有被即时扣除,但是,投标成功的用户无法使用冻结款就可以了吧(它们看到的是扣除后的样子,虽然实质没有扣除)。######回复 @Chen大猩猩 : 扣费进程用的接口可能卡死已经明白,但是,你用户进程又要等待扣费进程的处理结果,你分进程也是死路啊。除非让用户不等待最终处理结果,告知已经投标,等待处理(钱保持冻结)。######回复 @Yashin : 这样的效率。。性能。。。投标,扣费都是批量级的,这样很影响体验。有别的办法吗?这是行级别锁了吧######回复 @Chen大猩猩 : 做个锁只锁某个用户,扣费的时候加锁,投标判断一下有锁就等要不就失败咯###### @红薯 @Yashin 帮忙出个主意撒
    2020-06-07 20:15:50
    赞同 展开评论
问答地址: