带有大量数据库修改和事务的业务操作,要批量操作怎么实现最好?
我有一个功能,和余额变动相关,保守估计至少要同时修改5张表。
单独做这个功能并不复杂,但是我现在有个批量操作的需求,比如一次性提交100条,那我就得一次性修改5张表*100次,执行最少500次sql,这显然不太科学。
可以把它放到队列里执行,但是消费到这条队列消息可能需要时间,且执行这条队列消息一定会消耗时间,就会出现用户提交请求,也提示成功,但是刷新后这些数据还是显示未处理的情况。
如果提交时sql加in一次性先把这些数据加状态隐藏起来,慢慢等业务执行完,又有点头疼,因为执行可能需要时间,应该收到余额的用户和操作人可能会出现一时半会对不上账的情况。其次如果执行失败再退回去对用户也不太友好,因为之前已经提示他成功了。
有没有老哥有什么优雅的方式完美解决这个问题
关于 LearnKu
放队列,用户提交后换个说法就行了
在批量操作的地方直接告诉用户批量操作是非实时的,数据更新会有延迟
看这个批量能不能批量进行修改
使用 case 聚合更新 五张表的话就是5条sql 。更新条件走主键id的话没什么问题
模型类 use 后使用:
方法:
参考一下某些银行的做法, 转账的时候有一个等待窗口, 然后转账后提示不要在此页面离开, xs 后自动查询结果
代码上锁, 处理完成写一条消息余额变动, 然后界面轮询这个消息状态
涉及到钱?涉及到钱的别做什么批量,安安心心一条条处理。与产品经理互怼,提交的100条第90条格式错误怎么办,执行到90条时OOM意外退出怎么办,用户在两个窗口提交两次100条怎么办,执行到90条余额不够了怎么办,第90余额只够一部分不够全部怎么办,用户在一个页面提交完又刷新提交了一次怎么办,有没有办法识别两次处理的同一个100条,处理100条时间长怎么告诉用户要等。并不是银行可以做你们就可以做。银行也是提交个代发工资excel 晚上才一起发的。为了鲁棒付出的代价到底值不值得。