我有一个要执行的MySQL任务表,每行都有一个任务的参数.
有许多工作者应用程序(可能在不同的机器上),在循环中执行任务.
应用程序使用MySQL的本机C API访问数据库.
为了拥有一个任务,一个应用程序做了类似的事情:
生成全局唯一ID(为简单起见,假设它是一个数字)
UPDATE tasks
SET guid = %d
WHERE guid = 0 LIMIT 1
SELECT params
FROM tasks
WHERE guid = %d
如果最后一个查询返回一行,我们拥有它并让参数运行
有没有办法在一次调用服务器时实现相同的效果(即'拥有'一行并获取其参数)?
试试这样
UPDATE `lastid` SET `idnum` = (SELECT `id` FROM `history` ORDER BY `id` DESC LIMIT 1);
上面的代码对我有用
您可以创建一个执行此操作的过程:
CREATE PROCEDURE prc_get_task (in_guid BINARY(16), OUT out_params VARCHAR(200)) BEGIN DECLARE task_id INT; SELECT id, out_params INTO task_id, out_params FROM tasks WHERE guid = 0 LIMIT 1 FOR UPDATE; UPDATE task SET guid = in_guid WHERE id = task_id; END; BEGIN TRANSACTION; CALL prc_get_task(@guid, @params); COMMIT;