oracle数据库,用户表有有余额,冻结款 2个字段。
1)用户投标,要校验用户余额是否可用,余额可用的时候,投标(加入订单表),扣除余额,增加冻结款;
2)扣费进程,一直扫描订单表。扫描到有订单时,进行判断投标是否满了。 满了,扣除冻结款。不满标撤了则 返回冻结款到余额去,余额新增。
问题: 如果保证 校验过程中,读取余额字段不会读取到扣费进程修改前的数据?注意,这里是两个进程对数据的操作。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
扣费进程锁住(lock)要操作的用户表的数据。
但是处理的用户很多的话,最后被处理的用户会面对什么画面?
看你的设计,用户投标和扣费进程是同时进行的,为什么要多进程?为什么还加个冻结款字段?用户投标到余额扣除应该是1个事务的处理才正常吧。不知道你是否有什么特殊要求。
######回复 @Chen大猩猩 : 总之,扣费进程的卡死不解决,扣费和投标不能同步,无解。给点建议,你的扣费进程应该像个批处理,只处理余额扣除,不处理其他东西,也就是余额不扣除的判断,与后续处理不在扣费进程中执行。而余额扣除的处理(扣费进程)也不需要(认为不可能)与用户进程同步,虽然余额没有被即时扣除,但是,投标成功的用户无法使用冻结款就可以了吧(它们看到的是扣除后的样子,虽然实质没有扣除)。######回复 @Chen大猩猩 : 扣费进程用的接口可能卡死已经明白,但是,你用户进程又要等待扣费进程的处理结果,你分进程也是死路啊。除非让用户不等待最终处理结果,告知已经投标,等待处理(钱保持冻结)。######回复 @Yashin : 这样的效率。。性能。。。投标,扣费都是批量级的,这样很影响体验。有别的办法吗?这是行级别锁了吧######回复 @Chen大猩猩 : 做个锁只锁某个用户,扣费的时候加锁,投标判断一下有锁就等要不就失败咯###### @红薯 @Yashin 帮忙出个主意撒