我有表,并且有许多(太多)请求从中选择一行。选择行后,脚本运行更新查询以设置该行已被“选中”的标志。但由于我们每次都有太多请求,在一个线程之间选择一行并更新其标志的时间段内,另一个线程有时间选择同一行。
选择查询从表中获取一行,按某个字段对其进行排序并使用LIMIT 0,1。我需要该DB只是跳过之前选择过的行。
引擎是InnoDB。
答案 0 :(得分:2)
在开始交易之前,请拨打以下电话:
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;