У меня есть следующий алгоритм:MySQL: одновременный доступ
- Выберите строку, которая не имеет никакого ответа и не блокируется (состояние 0)
- Заблокировать эту строку, чтобы запретить другим пользователям получать его (статус 1)
есть статус 2-й ряд имеет ответ и завершен.
SELECT * FROM details WHERE RowStatus=0 AND taskid=".$task_id." ORDER BY RAND() LIMIT 1
UPDATE details SET RowStatus=1 ,Agent='".$_SESSION['username']."' where TaskID=".$row['TaskID']." and RowId=".$row['RowId']
Проблема заключается в том, что если у меня есть 10 строк слева и 8 агентов, работающих на задачу, иногда бывает, что они представляют предыдущий ряд точно то же самое время. Затем оба они выбирают одну и ту же строку, и только одна из них блокирует строку с его именем. Значение - один из них работает над той же строкой.
Его звучит как второстепенная проблема, но почему-то это произошло 5-10 раз в задаче на 2500 строк. Есть ли способ заблокировать строку в то же время, что и ее выбор? Запретить другому пользователю выбирать эту строку?
Есть ли реальная причина, по заказу рандов() или это просто, чтобы попытаться избежать конфликтов? –
Вы можете использовать транзакции, если вы работаете над 'InnoDB' –
Сначала я не использовал случайные, но тогда вероятность того, что они оба получат одинаковые строки, увеличится. – Alex