Mysql锁定并发读取/更新行

时间:2011-06-08 22:01:12

标签: php mysql concurrency innodb

我有表,并且有许多(太多)请求从中选择一行。选择行后,脚本运行更新查询以设置该行已被“选中”的标志。但由于我们每次都有太多请求,在一个线程之间选择一行并更新其标志的时间段内,另一个线程有时间选择同一行

选择查询从表中获取一行,按某个字段对其进行排序并使用LIMIT 0,1。我需要该DB只是跳过之前选择过的行。

引擎是InnoDB。

1 个答案:

答案 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;