Во-первых: MySQL является одним из худших компонентов программного обеспечения для реализации, особенно если он очень динамичный. Причина в том, что механизмы, такие как MEMORY и MyISAM, имеют только блокировки полной таблицы, в то время как более подходящие механизмы, такие как InnoDB, имеют более высокий штраф на запись (для предоставления свойств ACID) и оптимизированы для доступа к записям, которые пространственно и временно закрыты (те, которые установлены в памяти). ). Также нет хорошей системы уведомлений об изменениях для MySQL - она должна быть реализована как опрос. Существуют десятки программ, более оптимизированных для этой задачи .
Сказав это, я видел успешную реализацию такого рода доступа, если требования к производительности / эффективности не очень высоки. Многие люди не могут позволить себе внедрить и поддерживать отдельный отдельный элемент технологии только для небольшой части бизнес-логики.
SELECT FOR UPDATE
это то, что вы ищете - читайте сериализацию. Хотя UPDATE / DELETE всегда блокирует строку во время выполняющейся транзакции MYSQL, вы можете избежать большой транзакции во время процесса, поэтому:
START TRANSACTION;
SELECT * FROM your_table WHERE state != 'PROCESSING'
ORDER BY date_added ASC LIMIT 1 FOR UPDATE;
if (rows_selected = 0) { //finished processing the queue, abort}
else {
UPDATE your_table WHERE id = $row.id SET state = 'PROCESSING'
COMMIT;
// row is processed here, outside of the transaction, and it can take as much time as we want
// once we finish:
DELETE FROM your_table WHERE id = $row.id and state = 'PROCESSING' LIMIT 1;
}
MySQL позаботится о блокировке всех одновременных выборок, кроме одной, при выборе строк. Поскольку это может привести к большому количеству заблокированных соединений одновременно, сделайте начальную транзакцию как можно меньше и попытайтесь обрабатывать больше одной строки за раз.