По-перше: 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 піклується про блокування всіх одночасно вибраних, крім одного, під час вибору рядків. Оскільки це може призвести до безлічі заблокованих з'єднань одночасно, зберігайте початкову транзакцію якомога менше і намагайтеся обробляти більше, ніж 1 ряд одночасно.