リアルタイムではなくスレッド内のアイテムを処理するためのデータベースベースのキューを持つシステムがあります。これは現在、mysqlでこのストアドプロシージャを呼び出すMybatisに実装されています。
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でこのストアドプロシージャを呼び出すと、キューから5つのアイテムがポップされて作業が開始されますが、lastPopDateが設定されるのは5番目のアイテムのみであるため、次のスレッドが来てキューからポップすると、アイテムが取得されます。 1-4および項目6。
これを取得して、データベースから「ポップ」されたすべてのNレコードを更新するにはどうすればよいですか?