我们有一个系统,它有一个基于数据库的队列,用于在线程中而不是实时处理项目。目前在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 条记录?