列队中如何锁定已经开始执行的数据?
疑问
在列队中系统会 1 分站一次执行数据库中已经支付完成的订单 ( check = 1) 并且是已经完成的订单 ( ck = 1 ),那么在订单多的是就会出现 订单 1000 已经在执行,下次的列队执行又开始了导致了 订单 1000 被多次重复执行
一个小型商城,订单执行是调取其他 API 在订单支付完成的时候直接调用一下接口就可以,但是我遇到了列队间隔时间比较短就导致部分订单重复执行
我的想法是在一开始查询的时候就给数据库字段加上一个 lock = 1 ,在列队的时候查询 ( check = 1 , ck = 0 ,lock = 0 )的数据,但是这样我的订单列表 lock = 1 的操作还没完成, 下一个列队执行依旧会出现重复执行的问题?
换一个思路,列队执行的时候检测有没有其他列队正在执行,如果有就等待列队执行完成,如果没有则开始处理数据。这种事可行的
但我还是想弄懂 不去阻塞如何确保数据完美执行?
或者优化队列,每次下单的时候,使用redis 的 zset 记录 orderid 和 created_at,其他 created_at 为 score,订单完成的时候移除这个 orderid, 这样一分钟只需要查一下 redis 的zset,性能比查询大的数据库快太多了