我们有一个系统,它使用基于数据库的队列来处理项目,而不是实时处理。目前是在Mybatis中实现的,调用MySQL中的此存储过程:
DROP PROCEDURE IF EXISTS pop_invoice_queue;
DELIMITER ;;
CREATE PROCEDURE pop_invoice_queue(IN compId int(11), IN limitRet int(11)) BEGIN
SELECT LAST_INSERT_ID(id) as value, InvoiceQueue.* FROM InvoiceQueue
WHERE companyid = compId
AND (lastPopDate is null OR lastPopDate < DATE_SUB(NOW(), INTERVAL 3 MINUTE)) LIMIT limitRet FOR UPDATE;
UPDATE InvoiceQueue SET lastPopDate=NOW() WHERE id=LAST_INSERT_ID();
END;;
DELIMITER ;
问题在于该存储过程从队列中弹出了N个项目,但只更新了最后一个弹出的项目的lastPopDate值。因此,如果我们使用limitRet = 5调用此存储过程,它将从队列中弹出五个项目并开始处理它们,但只有第五个项目会设置lastPopDate,因此当下一个线程来弹出队列时,它将获取项目1-4和6。
如何才能更新所有从数据库“弹出”的N条记录?