mysql数据库中的并发访问问题

mysql数据库中的并发访问问题,sql,mysql,database,concurrency,Sql,Mysql,Database,Concurrency,您好,我正在编写一个python脚本,该脚本将创建一些从数据库获取和执行任务的子进程 任务由运行在同一台机器上的php网站插入到数据库中 选择这些任务并将其更新为“正在进行”以避免被python脚本多次选择的好方法(需要快速)是什么 编辑:数据库是mysql 提前感谢在不了解您的体系结构的情况下,我建议使用以下方法 1) Lock Process table 2) Select ... from Process table where State="New" 3) processlist = [

您好,我正在编写一个python脚本,该脚本将创建一些从数据库获取和执行任务的子进程

任务由运行在同一台机器上的php网站插入到数据库中

选择这些任务并将其更新为“正在进行”以避免被python脚本多次选择的好方法(需要快速)是什么

编辑:数据库是mysql


提前感谢

在不了解您的体系结构的情况下,我建议使用以下方法

1) Lock Process table
2) Select ... from Process table where State="New"
3) processlist = [list of process id''s from step 2]
4) Update Process table set State="In progress" where ProcessId in [processlist]
5) Unlock Process table.

加快速度的一种方法是将进程放入存储过程中,并从该过程返回所选行。这样,只需访问数据库服务器一次。

使用InnoDB表
任务
,然后:

select TaskId, ... from Tasks where State="New" limit 1;
update Tasks set State="In Progress" where TaskId=<from above> and State="New";
选择任务ID。。。来自State=“New”限制为1的任务;
更新任务集State=“In Progress”,其中TaskId=和State=“New”;
如果更新成功,则可以执行该任务。否则,请再试一次


您需要关于TaskId和State的索引。

您使用的是哪个数据库?SQL Server、MySQL?对不起,我忘了在问题中指定。这是MySQL,过程与此非常相似,但每个python脚本一次提取1个任务。我想锁定表,但它正在寻找一种更快的方法。将限制1放在您的选择中(步骤2)我看不到绕过锁定的方法。太好了,这样我可以同时进行插入吗?也许我可以将这段代码改编成一个存储过程?可以同时插入新任务行。我打赌你可以把我的代码变成一个存储过程,这样你只需要一次到数据库的往返(我的代码需要2+)。我想知道锁定/选择/更新/解锁和使用多个键选择/更新之间的取舍是什么。我想我会注意到你可以像这样将此更新原子化:
updatetasks set TaskId=(@working\u taskid:=taskid),State=“In Progress”where State=“New”limit 1;选择@working\u taskid;
。如果您对任务有很多争用,这可能会提供更好的性能。