Струва ми се, че това вече беше предложено, но все пак и аз да добавя моите 50 стотинки.
Първата, ама най-първата заявка трябва да ти бъде директен UPDATE.
Приемаме, че идентификационният номер на потребителя е 666, можеш да го подаваш като сесийна променлива от PHP, примерно. Полето locked_by_user_sid е уникално (един потребител може да обработва само един запис в един и същи момент).
UPDATE
customer
SET
locked_by_user_sid = 666
WHERE
locked_by_user_sid IS NULL
AND
...
LIMIT
1;
Втората, третата и т.н. заявки вече са от вида:
SELECT
...
FROM
customer
...
WHERE
locked_by_user_sid = 666;
Като свърши работата с дадения запис, се прави:
UPDATE
customer
SET
locked_by_user_sid = NULL
WHERE
locked_by_user_sid = 666;
Това е. С този алгоритъм тук безпроблемно едновременно работеха стотици хора в един call centre. Ключовото е първата ти заявка да бъде незабавен UPDATE, така че следващият потребител да не попадне на същия ред, а да промени друг и т.н.
Иначе като цяло SELECT ... FOR UPDATE наистина изглежда яко, но на практика е възможно 100 човека да зависнат и да чакат за един и същи ред, което пак те връща в изходна позиция.
"Договор, подписан с Русия, струва по-малко от хартията, върху която е написан!" - БисмаркРедактирано от Dakota на 06.01.09 17:58.