Mysql блокировка одновременного чтения / обновления строки - PullRequest
0 голосов
/ 09 июня 2011

У меня есть таблица и много (слишком много) запросов на выделение из нее одной строки. После выбора строки скрипт запускает запрос на обновление, чтобы установить флаг, который означает, что эта строка была «выбрана». Но поскольку у нас слишком много запросов за раз, в период между одним потоком выберите строку и обновите ее флаг, другой поток успеет выбрать ту же строку .

Запрос на выборку получает одну строку из таблицы, упорядочивая ее по некоторому полю и используя LIMIT 0, 1. Мне нужно, чтобы БД просто пропустила строку, которая была выбрана ранее.

Двигатель InnoDB.

1 Ответ

2 голосов
/ 09 июня 2011

Непосредственно перед началом транзакции вызовите следующее:

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;
...