【发布时间】:2011-06-08 22:01:12
【问题描述】:
我有一张桌子,有很多(太多)要求从中选择一行。选择一行后,脚本运行更新查询来设置一个标志,即该行已被“选中”。但是由于每次请求太多,在一个线程选择一行并更新其标志之间的时间段内,另一个线程有时间选择同一行。
选择查询从表中获取一行,按某个字段对其进行排序并使用 LIMIT 0、1。我需要该数据库跳过之前选择的行。
引擎是 InnoDB。
【问题讨论】:
标签: php mysql concurrency innodb
我有一张桌子,有很多(太多)要求从中选择一行。选择一行后,脚本运行更新查询来设置一个标志,即该行已被“选中”。但是由于每次请求太多,在一个线程选择一行并更新其标志之间的时间段内,另一个线程有时间选择同一行。
选择查询从表中获取一行,按某个字段对其进行排序并使用 LIMIT 0、1。我需要该数据库跳过之前选择的行。
引擎是 InnoDB。
【问题讨论】:
标签: php mysql concurrency innodb
就在您开始交易之前,调用以下命令:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
这将确保如果您读取带有标志的行,当您在同一事务中更新它时,它仍然是这种方式。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT id_site
INTO @site
FROM table1 WHERE flag = 0 ORDER BY field LIMIT 0,1;
UPDATE table1 SET flag = 1 WHERE id_site = @site;
COMMIT;
【讨论】: