我在mysql数据库中有类似任务的列表,并且有一个PHP脚本,它一次可以提取1个任务并执行它。完成后,将标志从待处理更改为完成
我想通过添加在同一数据库上运行的更多脚本(最多20个)来提高性能。我如何确保这些脚本不会两次执行同一任务,即。处理表中的同一行
谢谢!
答案 0 :(得分:0)
一种可能的方法是:
flag
列的数据类型更改为ENUM
类型(如果尚未更改)。它将具有三个可能的Enum值:pending
,in_process
,done
。pending
任务时,在表上执行显式的LOCK
;这样其他会话都无法更新它。代码示例:
LOCK TABLES tasks_table WRITE; -- locking the table for read/write
-- Selecting a pending task to do
SELECT * FROM tasks_table
WHERE flag = 'pending'
LIMIT 1;
-- In application code (PHP) - get the Primary key value of the selected task.
-- Now update the flag to in_process for the selected task
UPDATE tasks_table
SET flag = 'in_process'
WHERE primary_key_field = $selected_value;
代码:
-- Release the explicit Lock
UNLOCK TABLES;